zoukankan      html  css  js  c++  java
  • 获取调用者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();
    
            }
  • 相关阅读:
    java Future模式的使用
    Objects源码解析
    VUE优秀的组件库总结
    数据库的一致性读,赃读,多线程与赃读,ACID,UNDO
    线程基础,多线程架构,高并发,线程安全基础知识
    程序员必备的开发利器
    spring security 实现登录验证码及记住我
    springboot 集成 spring security 自定义登录
    ELK整合SpringBoot日志收集
    ElasticSearch整合SpringBoot的API操作
  • 原文地址:https://www.cnblogs.com/vvonline/p/4281185.html
Copyright © 2011-2022 走看看