package com.sea.test.utils;
import java.beans.PropertyDescriptor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method;/**
* @author sea
* 比较两个Bean的内容
* @param */
public class ContrastObjUtils{/**
* 自定义注解,如果字段上有该注解,就比较
* @author sea
**/@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)public@interface ComparaField {
String value()default "";
}/**
* 之比较有注解的字段
* @param oldBean
* @param newBean
* @return*/
publicString comparObjWithAnnotion(Object oldBean, Object newBean) {
String result= "";
T pojo1=(T) oldBean;
T pojo2=(T) newBean;try{
Class clazz=pojo1.getClass();
Field[] fields=pojo1.getClass().getDeclaredFields();int i = 1;//loop all field
for(Field field : fields)
{
boolean hasAnnotation= field.isAnnotationPresent(ComparaField.class);//如果没有注解,skip
if (!hasAnnotation) {continue;
}
PropertyDescriptor pd= newPropertyDescriptor(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()))
{if (i != 1)
{
result+= ";";
}//要显示的字段名
String fieldName =field.getName();
result+= i + "、" + fieldName + ",旧值:" + o1 + ",新值:" +o2;
}
i++;
}
}catch(Exception e) {
e.printStackTrace();
}returnresult;
}/**
* 比较所有field
* @param oldBean
* @param newBean
* @return*/
publicString comparObj(Object oldBean, Object newBean) {
String result= "";
T pojo1=(T) oldBean;
T pojo2=(T) newBean;try{
Class clazz=pojo1.getClass();
Field[] fields=pojo1.getClass().getDeclaredFields();int i = 1;//loop all field
for(Field field : fields) {if ("serialVersionUID".equals(field.getName())) {continue;
}
PropertyDescriptor pd= newPropertyDescriptor(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())) {if (i != 1) {
result+= ";";
}//要显示的字段名
String fieldName = "";
fieldName=field.getName();
result+= i + "、" + fieldName + ",旧值:" + o1 + ",新值:" +o2;
i++;
}
}
}catch(Exception e) {
e.printStackTrace();
}returnresult;
}
}