获取调用者Class和method、反射获取get方法、获取注解信息

 

调用者Class 及 method

复制代码
StackTraceElement stacks[] = Thread.currentThread().getStackTrace();
        for (StackTraceElement stack : stacks) {
            String className = stack.getClassName();
            if (className.contains("com.upsoft")
                    && className.contains("Controller")) {
                className = className.substring(className.lastIndexOf(".") + 1,
                        className.length());
                String methodName = stack.getMethodName();
            }
        }
复制代码

 

反射(get)

复制代码
// 通过反射 遍历实体所有属性,找出发生改变的字段及修改前和修改后的值
        Field[] fields = entity.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {

            changeColumn = new ColumnChangeBean();
            String attrName = fields[i].getName();
            Class<?> attrType = fields[i].getType();
            Method method = getGetMethod(entity.getClass(), attrName);

            try {

                Object oldValue = null;
                Object newValue = null;

                // 通过反射获取 oldValue 和 newValue 的值
                if (oldEntity != null) {
                    oldValue = method.invoke(oldEntity, new Object[0]);
                }
                newValue = method.invoke(entity, new Object[0]);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
复制代码
复制代码
    private Method getGetMethod(Class objectClass, String fieldName) {
        StringBuffer sb = new StringBuffer();
        sb.append("get");
        sb.append(fieldName.substring(0, 1).toUpperCase());
        sb.append(fieldName.substring(1));
        try {
            return objectClass.getMethod(sb.toString());
        } catch (Exception e) {
        }
        return null;
    }
复制代码

 反射(set)

复制代码
public static void invokeSet(Object o, String fieldName, Object value) {       
  
    Method method = getSetMethod(o.getClass(), fieldName);       
  
    try {       
  
        method.invoke(o, new Object[] { value });       
  
    } catch (Exception e) {       
  
        e.printStackTrace();       
  
    }       
  
}



public static Method getSetMethod(Class objectClass, String fieldName) {       
  
    try {       
  
        Class[] parameterTypes = new Class[1];       
  
        Field field = objectClass.getDeclaredField(fieldName);       
  
        parameterTypes[0] = field.getType();       
  
        StringBuffer sb = new StringBuffer();       
  
        sb.append("set");       
  
        sb.append(fieldName.substring(0, 1).toUpperCase());       
  
        sb.append(fieldName.substring(1));       
  
        Method method = objectClass.getMethod(sb.toString(), parameterTypes);       
  
        return method;       
  
    } catch (Exception e) {       
  
        e.printStackTrace();       
  
    }       
  
    return null;       
  
} 
复制代码

 

 

获取类注解信息

复制代码
Annotation[] annotations = entity.getClass().getAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            String annoStr = annotations[i].toString();
            if (annoStr.contains("@javax.persistence.Table")) {
                annoStr = annoStr.substring(annoStr.lastIndexOf("name=") + 5);
                while (annoStr.contains(",")) {
                    annoStr = annoStr.substring(0, annoStr.lastIndexOf(","));
                }
                tableName = annoStr;
            }
        }
复制代码

获取方法、属性注解

复制代码
Field[] fields = entity.getClass().getDeclaredFields();

        // 遍历Bean属性
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            String attrName = field.getName();
            // 获取属性对应的get方法
            Method method = getGetMethod(entity.getClass(), attrName);

            Annotation[] attrAnnotations = field.getAnnotations();
            Annotation[] methodAnnotations = method.getAnnotations();

        }
复制代码

 

posted @   vv_online  阅读(3602)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示