美文网首页
java利用反射获取对象前后修改的内容(用于日志记录)

java利用反射获取对象前后修改的内容(用于日志记录)

作者: 蓝胖子的白日梦丶 | 来源:发表于2020-06-12 17:15 被阅读0次
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class BeanChangeUtil<T> {
 
    public static <T> void main(String[] args) {
        User u1 = new User("1", true, "a");
        User u2 = new User("2", false, "b");
        BeanChangeUtil<T> t = new BeanChangeUtil<>();
        String str = t.contrastObj(u1, u2);
        if (str.equals("")) {
            System.out.println("未有改变");
        } else {
            System.out.println(str);
        }
    }
 
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public String contrastObj(Object oldBean, Object newBean) {
        StringBuilder str = new StringBuilder();
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        try {
            // 通过反射获取类的类类型及字段属性
            Class clazz = pojo1.getClass();
            Field[] fields = clazz.getDeclaredFields();
            int i = 1;
            for (Field field : fields) {
            // 排除序列化属性
                if ("serialVersionUID".equals(field.getName())) {
                    continue;
                }
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                // 获取对应属性值
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = getMethod.invoke(pojo2);
                if (o1 == null || o2 == null) {
                    continue;
                }
                if (!o1.toString().equals(o2.toString())) {
                    str.append(i + "、字段名称:" + field.getName() + ",旧值:" + o1 + ",新值:" + o2 + ";");
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str.toString();
    }
 
    static class User {
        private String about;
 
        private boolean lock;
 
        private String name;
 
        public User() {
        }
 
        public User(String about, boolean lock, String name) {
            super();
            this.about = about;
            this.lock = lock;
            this.name = name;
        }
        /*省略get、set方法*/
    }
 
}

相关文章

  • java利用反射获取对象前后修改的内容(用于日志记录)

  • java面试知识点(四)- java 动态代理

    java 反射 反射是一种机制,提供java 程序在RunTime获取类的元属性信息,创建对象,执行方法,修改权限...

  • java反射和动态代理

    java反射 反射是程序运行时,通过反射直接操作对象或者类。获取类声明的属性和方法,调用方法或者构造对象,设置修改...

  • 反射

    1.原理 java反射是java中获取内存中字节码对象,然后获取对象的属性,方法对对像进行修改的一种技术。框架的核...

  • 反射机制案例

    在Java中,可以利用反射获取指定类型的公有/私有属性、方法,生成该类的实例对象,并调用该对象的方法。 以下反射相...

  • Java 反射

    Java反射Java反射API获取Class对象通过反射创建实例对象,调用公共方法通过反射调用私有方法 一.Jav...

  • java反射机制

    java反射机制是为了动态获取类的结构,动态地调用对象的方法 java反射机制 获取类Class对象 A.clas...

  • java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: 通过反射获...

  • JNI数据传输速度测试

    记录c++二维数组的json(rapidjson)转换 ,和记录jni通过反射获取java对象数据测试一:对象传递...

  • 一份反射go reflect的API练习以及其坑点

    主要内容: 由对象获取反射类型,由对象获取反射值 由反射值获取反射类型 反射值重新转换成对象 遍历字段 遍历方法 ...

网友评论

      本文标题:java利用反射获取对象前后修改的内容(用于日志记录)

      本文链接:https://www.haomeiwen.com/subject/xucazhtx.html