Java 通过反射的方式 比较同一类的A,B两个对象,如果A、B同属性不同值,则用B属性的值覆盖A属性的值
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import cn.org.nercita.pro.comm.bean.Place;
public class UpdateObject {
public static boolean compareToParam(Object object1,Field field1,Object object2,Field field2) throws Exception{
Method m1 = (Method) object1.getClass().getMethod("get" + getMethodName(field1.getName()));
Method m2 = (Method) object2.getClass().getMethod("get" + getMethodName(field2.getName()));
if(m1.invoke(object1) == null){
return false;
}
if(field1.getType().equals(String.class)){
String value1 = (String) m1.invoke(object1);
String value2 = (String) m2.invoke(object2);
if( value2 != null && value1.equals(value2) ) return true;
}
if(field1.getType().equals(Integer.class)){
Integer value1 = (Integer) m1.invoke(object1);
Integer value2 = (Integer) m2.invoke(object2);
if( value2 != null && value1.equals(value2)) return true;
}
if(field1.getType().equals(Date.class)){
Date value1 = (Date) m1.invoke(object1);
Date value2 = (Date) m2.invoke(object2);
if( value2 != null &&(value1.compareTo(value2) == 0)) return true;
}
if(field1.getType().equals(Date.class)){
}
return false;
};
/**
* 用object2的属性去覆盖object1的属性
* @param object1
* @param field1
* @param object2
* @param field2
* @return
* @throws Exception
*/
public static void copyDiffParam(Object object1,Field field1,Object object2,Field field2) throws Exception{
if(field1.getType().equals(String.class)){
Method m1 = (Method) object1.getClass().getMethod("set" + getMethodName(field1.getName()),String.class);
Method m2 = (Method) object2.getClass().getMethod("get" + getMethodName(field2.getName()));
if(m2.invoke(object2) != null){
m1.invoke(object1, (String)m2.invoke(object2));
}
}
if(field1.getType().equals(Integer.class)){
Method m1 = (Method) object1.getClass().getMethod("set" + getMethodName(field1.getName()),Integer.class);
Method m2 = (Method) object2.getClass().getMethod("get" + getMethodName(field2.getName()));
if(m2.invoke(object2) != null){
m1.invoke(object1, (Integer)m2.invoke(object2));
}
}
if(field1.getType().equals(Date.class)){
Method m1 = (Method) object1.getClass().getMethod("set" + getMethodName(field1.getName()),Date.class);
Method m2 = (Method) object2.getClass().getMethod("get" + getMethodName(field2.getName()));
if(m2.invoke(object2) != null){
m1.invoke(object1, (Date)m2.invoke(object2));
}
}
if(field1.getType().equals(Double.class)){
}
};
public static String changeObjectFilds(Object object1,Object object2) throws Exception{
Class<?> class1 = object1.getClass();
Class<?> class2 = object2.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields1 = class1.getDeclaredFields();
Field[] fields2 = class1.getDeclaredFields();
if(fields1.length != fields2.length){
return "error";
}
int i=0;
for (Field field : fields1) {
if(!compareToParam(object1, field, object2, fields2[i])){
copyDiffParam(object1, field, object2, fields2[i]);
}
++i;
}
return "";
}
public static void printfParam(Object object) throws Exception{
Class<?> cla = object.getClass();
Field[] fields1 = cla.getDeclaredFields();
for (Field field : fields1) {
Method m1 = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));
System.err.println(field.getName()+":"+m1.invoke(object));
}
}
private static String getMethodName(String fildeName){
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
public static void main(String args[]) {
Place place = new Place();
Place place2 = new Place();
place2.setName("wangjunjun");
try {
UpdateObject.printfParam(place);
UpdateObject.printfParam(place2);
UpdateObject.changeObjectFilds(place, place2);
UpdateObject.printfParam(place);
UpdateObject.printfParam(place2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}