首页 > 编程语言 >java 8 利用lambda 获取 记录类(get/set) field 上面 注解

java 8 利用lambda 获取 记录类(get/set) field 上面 注解

时间:2023-11-30 16:59:35浏览次数:46  
标签:set return import public field new java annotation

package tianrun.ziguan.api.center.alert.util;

import com.baomidou.mybatisplus.annotation.TableField;

import java.io.*;
import java.lang.annotation.Annotation;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Function;

/**
 * @author: Yh
 * @date: 2023/11/30 15:37
 */
public class ClassUtil {

    public static String column(FF<?, ?> func) {
        TableField o = resolveLambdaProxyFieldAnnotation(func, TableField.class);
        if (o == null) {
            return "";
        }
        return o.value();
    }

    public static <T> T resolveLambdaProxyFieldAnnotation(FF<?, ?> func, Class<T> an) {
        SerializedLambda resolve = resolve(func);
        final String implMethodName = resolve.getImplMethodName().toUpperCase();
        try {
            Class<?> implClass = Class.forName(resolve.getImplClass().replaceAll("/", "."));
            final Field[] declaredFields = implClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                if (implMethodName.endsWith(declaredField.getName().toUpperCase())) {
                    final Annotation[] annotations = declaredField.getAnnotations();
                    for (Annotation annotation : annotations) {
                        if (an.isInstance(annotation)) {
                            return an.cast(annotation);
                        }
                    }
                }
            }
            final Field[] fields = implClass.getFields();
            for (Field field : fields) {
                if (implMethodName.endsWith(field.getName().toUpperCase())) {
                    final Annotation[] annotations = field.getAnnotations();
                    for (Annotation annotation : annotations) {
                        if (an.isInstance(annotation)) {
                            return an.cast(annotation);
                        }
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        return null;
    }


    public static byte[] serialize(Object object) {
        if (object == null) {
            return null;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
        try {
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            oos.flush();
        } catch (IOException ex) {
            throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
        }
        return baos.toByteArray();
    }

    public static SerializedLambda resolve(FF<?, ?> lambda) {
        try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(serialize(lambda))) {
            @Override
            protected Class<?> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException {
                return super.resolveClass(objectStreamClass);
            }
        }) {
            final Object o = objIn.readObject();
            return getSerializedLambda((Serializable) o);
        } catch (ClassNotFoundException | IOException e) {
            throw new IllegalArgumentException();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static SerializedLambda getSerializedLambda(Serializable serializable) throws Exception {
        Method writeReplaceMethod = serializable.getClass().getDeclaredMethod("writeReplace");
        writeReplaceMethod.setAccessible(true);
        return (SerializedLambda) writeReplaceMethod.invoke(serializable);
    }

    public interface FF<T, R> extends Function<T, R>, Serializable {
    }
}


标签:set,return,import,public,field,new,java,annotation
From: https://www.cnblogs.com/zzzz-yh/p/17867743.html

相关文章

  • 【开源】基于JavaWeb的固始鹅块销售系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的固始鹅块销售系统,包含了鹅块类型模块、固始鹅块模块、鹅块订单模块、评论管理模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,固始鹅块销售系统基于角色......
  • JavaScript 实现跨标签页移动元素效果
    该方案可实现跨浏览器容器进行拖动1.入口文件index.html<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • Java常用并发工具类
    同步工具类存在的意义管程或者信号量可以解决所有的并发问题,那么同步工具类存在的意义是什么呢?两个字:方便。针对不同的并发场景,使用对应的工具类可以快速完成业务开发。1.ReadWriteLock1.1使用场景允许多个线程同时读共享变量只允许一个线程写共享变量如果一个写......
  • mysql 启动报错【Error while setting value ‘NO_ENGINE_SUBSTITUTION, STRICT_TRANS
    报错如下: 原因:mysql配置文件my.ini里的sql_mode配置项参数中逗号后面有空格解决步骤:打开my.ini文件,找到sql_mode配置项删除空格,保存 ......
  • jmeter 分布式压测出现 :java.io.FileNotFoundException: rmi_keystore.jks (系统找不
    分布式执行压测时报错:Exceptioncreatingconnectionto:10.22.133.117;nestedexceptionis:java.io.FileNotFoundException:rmi_keystore.jks(系统找不到指定的文件。)解决方案:(执行机和被执行机器的jmeter版本要一致)1、修改jmeter.properties文件(jmeter的安装bin路......
  • supervisor管理启动重启,Java,Go程序Demo
    简介Supervisor是一款Python开发的进程管理系统,允许用户监视和控制Linux上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启1、安装yum-yinstallsupervisor2、配置默认配置文件echo_supervisord_conf>/etc/supervisord.conf3、修改主配置文件......
  • java线程池管理工具类
    1,这是线程池管理工具类,在系统关闭时确保任务执行完毕,自定义线程名字,自定义抛弃策略默认使用了CallerRunsPolicy拒绝策略importjava.util.concurrent.ExecutorService;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadFactory;importja......
  • JavaScript 防抖和节流
    JavaScript防抖和节流防抖以下js类库实现方法:lodash.debounceunderscore-debounce最初接触实现一个防抖函数的需求,是在前端封装React组件的过程中,当时是要实现一个搜索下拉框,根据输入提示搜索内容。根据<input>的input事件来监听用户输入,并调用后端接口传递输入信息......
  • javascript运行时报"未定义"错误怎么办
    https://www.php.cn/faq/508703.htmlJavascript是一种非常流行的编程语言,它广泛地应用于网页开发、动态效果实现、数据处理等领域。然而,Javascript也存在一些常见的错误,在开发的过程中需要我们注意和处理。其中之一的运行时错误:""未定义,下面就来详细介绍如何解决这一问题。什么......
  • 扩展的Java程序
    编写可扩展的Java程序是面向未来需求的关键。可扩展性使得程序能够方便地应对变化和增长,而不需要重构或重写大量代码。下面将介绍一些编写可扩展Java程序的最佳实践和设计原则,以帮助开发者构建灵活、可维护和具有良好扩展性的应用。模块化设计模块化设计是构建可扩展Java程序的基......