1. import java.beans.PropertyDescriptor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4.  
  5. public class BeanChangeUtil<T> {
  6.  
  7. public static <T> void main(String[] args) {
  8. User u1 = new User("1", true, "a");
  9. User u2 = new User("2", false, "b");
  10. BeanChangeUtil<T> t = new BeanChangeUtil<>();
  11. String str = t.contrastObj(u1, u2);
  12. if (str.equals("")) {
  13. System.out.println("未有改变");
  14. } else {
  15. System.out.println(str);
  16. }
  17. }
  18.  
  19. @SuppressWarnings({ "unchecked", "rawtypes" })
  20. public String contrastObj(Object oldBean, Object newBean) {
  21. StringBuilder str = new StringBuilder();
  22. T pojo1 = (T) oldBean;
  23. T pojo2 = (T) newBean;
  24. try {
  25. // 通过反射获取类的类类型及字段属性
  26. Class clazz = pojo1.getClass();
  27. Field[] fields = clazz.getDeclaredFields();
  28. int i = 1;
  29. for (Field field : fields) {
  30. // 排除序列化属性
  31. if ("serialVersionUID".equals(field.getName())) {
  32. continue;
  33. }
  34. PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
  35. // 获取对应属性值
  36. Method getMethod = pd.getReadMethod();
  37. Object o1 = getMethod.invoke(pojo1);
  38. Object o2 = getMethod.invoke(pojo2);
  39. if (o1 == null || o2 == null) {
  40. continue;
  41. }
  42. if (!o1.toString().equals(o2.toString())) {
  43. str.append(i + "、字段名称:" + field.getName() + ",旧值:" + o1 + ",新值:" + o2 + ";");
  44. i++;
  45. }
  46. }
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. return str.toString();
  51. }
  52.  
  53. static class User {
  54. private String about;
  55.  
  56. private boolean lock;
  57.  
  58. private String name;
  59.  
  60. public User() {
  61. }
  62.  
  63. public User(String about, boolean lock, String name) {
  64. super();
  65. this.about = about;
  66. this.lock = lock;
  67. this.name = name;
  68. }
  69. /*省略get、set方法*/
  70. }
  71.  
  72. }

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. 铁板纹理 Base Shape

    软件:Substance Designer 2017.1.2 最近正在根据官方的教程,学习Metal Rust纹理的制作.这篇文章仅记录Base Shape的制作方法. Base Shape最终渲染效 ...

  2. 7、Curator的常规操作

    package com.ourteam; import org.apache.curator.RetryPolicy;import org.apache.curator.framework.Curat ...

  3. 【Linux】【GIt】Linux下安装和配置Git(转)

    yum安装 这里采用的是CentOS系统,如果采用yum安装git的方式: yum install git 很快就okay了,但是这里遇到一个问题.: 在网上搜寻了原因,说是要安装: yum inst ...

  4. spring 入门demo

    相关资源 官网地址:http://projects.spring.io/spring-boot/ 创建maven项目 勾选箭头处,创建一个简单的项目  填写groupId和artifactId,点击确 ...

  5. CentOS6.8 下RPM方式安装MySQL5.6

    1. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名称) yum remove mysql mysql-server mysql-libs(我用的上面的)或者 [root ...

  6. leetcode461

    public class Solution { public int HammingDistance(int x, int y) { ]; ]; ; ; do { aryA[i] = x % ;//将 ...

  7. python 的深浅copy

    1.引用: A=B, 修改B后,A会被修改 2.浅拷贝:A=copy.copy(B) 3.深拷贝:A=copy.deepcopy(B) 如果希望任何改变,两个对象都不会相互影响,用深拷贝.详情参考:h ...

  8. spring boot 日志介绍 以及 logback配置示例

    https://www.cnblogs.com/flying607/p/7827460.html 以下是springboot的一个局部依赖关系: 可以看到,java util logging(jul) ...

  9. jsp页面中比较“接收数据”与“页面循环数据”是否相等

    页面中关系运算符: -lt 小于 -le   小于或者等于 -gt 大于 -ge 大于或者等于 -eq 等于 -ne 不等于 判空:<c:if test="${empty count  ...

  10. 转:解决AndroidStudio连不上Android设备真机的问题

    Android手机开发Android应用的时候,需要连接真机,进行应用软件的真机调试,但是由于诸多原因,可能导致无法与实现连接: 在我们连接了Android设备出现上面这种情况的时候,可以打开设备管理 ...