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利用反射获取对象前后修改的内容(用于日志记录)的更多相关文章

  1. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  2. 2018.5.11 Java利用反射实现对象克隆

    package com.lanqiao.demo; /** * 创建人 * @author qichunlin * */ public class Person { private int id; p ...

  3. 利用反射获取对象中的值等于x的字段

    Field[] field = behavior.getClass().getDeclaredFields(); for (int i = 0; i < field.length; i++) { ...

  4. c#利用反射获取对象属性值

    public static string GetObjectPropertyValue<T>(T t, string propertyname){     Type type = type ...

  5. JAVA使用反射获取对象的所有属性名

    public static void main(String[] args) { Field[] fields=BaseSalary.class.getDeclaredFields(); for (i ...

  6. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  7. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

  8. Android利用反射获取状态栏(StatusBar)高度

    MainActivity如下: package cc.teststatusbarheight; import java.lang.reflect.Field; import android.os.Bu ...

  9. .NET 利用反射将对象数据添加到数据库

    .NET 利用反射将对象数据添加到数据库   一些小型的项目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,这时候一些反复的增删改查就会让我们感到极其的繁琐,厌烦,为了避 ...

随机推荐

  1. SPI、I2C、UART、I2S、GPIO、SDIO、CAN 简介

    转自http://sanwen.net/a/fmxnjoo.html SPI.I2C.UART.I2S.GPIO.SDIO.CAN,看这篇就够了 总线 总线,总要陷进里面.这世界上的信号都一样,但是总 ...

  2. 03-封装BeanUtil工具类(javabean转map和map转javabean对象)

    package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...

  3. JS数据类型的判断

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示:    基本类型:String.Number.Boolean.Symbol.Undefine ...

  4. MYSQL与TiDB的执行计划

    前言 这里采用了tpc-h一个数据库的数据量来进行查询计划的对比.并借助tpc-h中的22条查询语句进行执行计划分析. mysql采用的是标准安装,TiDB采用的是单机测试版,这里的性能结果不能说明其 ...

  5. uva-10041-水题

    题意:有个人想找到个房子住,并且他经常去其他街道,输入n条街,给这个人选择一条街,使得他去其他街道的距离总和最小. 排序,双重for #include <string> #include& ...

  6. 尚硅谷springboot学习25-嵌入式Servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器:

  7. Vue.js组件之间的调用

    index.html: <div id="app"></div> 运行完index.html之后自动寻找运行main.js文件 main.js: impor ...

  8. Hibernate 再接触 悲观锁和乐观锁

    为什么取1248 二进制 CRUD 移位效率高 在并发和效率选择一个平衡点 一般不会考虑幻读 因为我们不会再一个事务里查询两次,(只能设置为seralizable) 悲观锁和乐观锁的前提是read-u ...

  9. Session & Cookie 简介

    (一)简介 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通 ...

  10. JQuery的可见性选择器

    1. <div id="test" style="width:400px;height:200; background:#0000ff;display:block; ...