Java 通过反射的方式应用


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();
		}
		
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值