java利用反射获取对象前后修改的内容(用于日志记录)
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利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- 2018.5.11 Java利用反射实现对象克隆
package com.lanqiao.demo; /** * 创建人 * @author qichunlin * */ public class Person { private int id; p ...
- 利用反射获取对象中的值等于x的字段
Field[] field = behavior.getClass().getDeclaredFields(); for (int i = 0; i < field.length; i++) { ...
- c#利用反射获取对象属性值
public static string GetObjectPropertyValue<T>(T t, string propertyname){ Type type = type ...
- JAVA使用反射获取对象的所有属性名
public static void main(String[] args) { Field[] fields=BaseSalary.class.getDeclaredFields(); for (i ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
- Android利用反射获取状态栏(StatusBar)高度
MainActivity如下: package cc.teststatusbarheight; import java.lang.reflect.Field; import android.os.Bu ...
- .NET 利用反射将对象数据添加到数据库
.NET 利用反射将对象数据添加到数据库 一些小型的项目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,这时候一些反复的增删改查就会让我们感到极其的繁琐,厌烦,为了避 ...
随机推荐
- 铁板纹理 Base Shape
软件:Substance Designer 2017.1.2 最近正在根据官方的教程,学习Metal Rust纹理的制作.这篇文章仅记录Base Shape的制作方法. Base Shape最终渲染效 ...
- 如何在idea里面新建一个maven项目,然后在这个maven项目里创建多个子模块
如何在idea里面配置maven我这里就不多说了 先新建一个maven项目作为总的管理项目 不用勾选什么,直接下一步 这样子一个普通的maven项目就创建成功了. 因为这个项目是用来管理多个子模块的, ...
- SpringMVC 启动流程
首先看一下Web应用部署初始化过程 (Web Application Deployement),官方文档说明: Web Application Deployment When a web applic ...
- C#设计模式(4)——抽象工厂模式(Abstract Factory)
简单工厂模式: 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码 工厂方法模式: 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单 ...
- HTML5-网页添加视频-菜鸟笔记
一.标签 <video> 在html5中,有这么个标签 <video> 标签. <video> 允许你简单的嵌入一段视频. 二.浏览器的兼容性问题 WebM 容器通 ...
- Java中锁的实现与内存语义
目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...
- [Redis]Redis高级特性的配置及使用
---------------------------------------------------------------------------- [Redis安全性] 一 . 默认我们进入Re ...
- API接口认证
restful API接口可以很方便的让其他系统调用,为了让指定的用户/系统可以调用开放的接口,一般需要对接口做认证; 接口认证有两种方式: 1.认证的token当做post/get的参数,serve ...
- 用element-ui 时,报value.getTime is not a function错误:
在用element-ui 时,报value.getTime is not a function错误:错误分析:date-picker 的时间是格林威时间,如果Thu Jun 22 2017 19:07 ...
- spring proxy-target-class
<tx:annotation-driven transaction-manager="transactionManager" ...