合并同一种bean的两个bean属性值

合并类属性的公共方法:

public class ReflectUtil {
 static Logger log = Logger.getLogger(ReflectUtil.class);
 /**
  * 合并对象,将src的值合并入des,如果值为null,则不覆盖
  * @param <T>
  * @param srcObj
  * @param desObj
  */
 public static <T> void mergeObject(T srcObj, T desObj) {
  if(srcObj == null || desObj == null) return;
  
  Field[] fs = srcObj.getClass().getDeclaredFields();
  for (int i=0; i<fs.length; i++) {
   try{
    fs[i].setAccessible(true);
    Object value = fs[i].get(srcObj);
    if(null != value){
     fs[i].set(desObj, value);
    }
    fs[i].setAccessible(false);
   }catch(Exception e){
    log.error(e);
   }
  }
 }
 
 /**
  * 合并对象(无编译时型别检查版),将src的值合并入des,如果值为null,则不覆盖 (使用时请确认需要合并的两个对象的field的定义一致!!)
  * @param srcObj source Object
  * @param desObj destine Object
  */
 public static void mergeObject_diff(Object srcObj, Object desObj) {
  if(srcObj == null || desObj == null) return;
  
  Field[] fs1 = srcObj.getClass().getDeclaredFields();
  Field[] fs2 = desObj.getClass().getDeclaredFields();
  for (int i=0; i<fs1.length; i++) {
   try{
    fs1[i].setAccessible(true);
    Object value = fs1[i].get(srcObj);
    fs1[i].setAccessible(false);
    if(null != value){
     fs2[i].setAccessible(true);
     fs2[i].set(desObj, value);
     fs2[i].setAccessible(false);
    }
   }catch(Exception e){
    log.error(e);
   }
  }
 }
 
 /**
  * 使用反射调用方法,唯一参数版
  * @param obj
  * @param methodName
  * @param valueClazz
  * @param value
  * @return
  */
 public static Object callMethod(Object obj,String methodName,Class valueClazz, Object value){
  return callMethod0(obj,methodName,new Class[]{valueClazz},new Object[]{value});
 }
 
 /**
  * 使用反射调用方法,多参数版
  * @param <T>
  * @param obj
  * @param methodName
  * @param valueClazz
  * @param value
  * @return
  */
 public static Object callMethod0(Object obj,String methodName,Class[] valueClazz, Object[] value){
  try {
   if(null != valueClazz[0]){
    Method method = obj.getClass().getMethod(methodName, valueClazz);
    return method.invoke(obj, value);//if method return void this value is null
   }else{
    Method method = obj.getClass().getMethod(methodName);
    return method.invoke(obj);
   }
   
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 
 /**
  * 直接获取对象的属性值,处理非bean规范的类
  * @param obj
  * @param name
  * @return
  */
 public static <T> T getFieldValue(Object obj,String name){
  try {
   Field fs = obj.getClass().getDeclaredField(name);
   fs.setAccessible(true);
   T retValue = (T) fs.get(obj);
   fs.setAccessible(false);
   return retValue;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 
 /**
  * 初始化属性列表
  * @param <T>
  * @param cols 在页面显示为几列
  * @param obj 泛型对象,用于反射
  * @return
  */
 public static <T> List<List<T>> initPropertyList(int cols,T obj) {
  List<List<T>> outter = new ArrayList<List<T>>();
  List<T> contents = Dao.find("from " + obj.getClass().getName());
  if(null != contents || contents.size() != 0){
   int size = contents.size();
   List<T> inner = new ArrayList<T>();
   int i = 0;
   while(i<size){
    if (i%cols == 0){
     inner = new ArrayList<T>();
     outter.add(inner);
    }
    inner.add(contents.get(i));
    i++;
   }
   for(int j=0;j<(cols-size)%cols;j++){
    try {
     Constructor con = obj.getClass().getConstructor(String.class);
     T nullObj = (T) con.newInstance("&nbsp;");
     inner.add(nullObj);
    } catch (Exception e) {
     log.error(e);
    }
   }
  }
  return outter;
 }
 
 public static String genWhereClauseByObject(Object obj){
  String result=" where 1=1";
  Field[] fs = obj.getClass().getDeclaredFields();
  try{
   for(Field f:fs){
    f.setAccessible(true);
    Object value = f.get(obj);
    if(null != value && !"".equals(value.toString())){
     String val = "";
     if(value.getClass()==java.util.Date.class){
      val = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value);
     }
     else if(value.getClass()==java.sql.Timestamp.class){
      val = value.toString().substring(0,19);
     }
     else{
      if(isNeedLike(obj.getClass().getSimpleName().toLowerCase(),f.getName()))
       result += " and " + f.getName() + " like '%" + value.toString() + "%'";
      else
       result += " and " + f.getName() + "='" + value.toString() + "'";
     }
     
     if(!"".equals(val)) result += " and " + f.getName() + ">='" + val + "' and "+f.getName()+" <= '"+val.substring(0,10)+" 23:59:59'";
    }
    f.setAccessible(false);
   }
  }catch(Exception e){
   log.error(e);
  }
  return result;
 }
 
 private static boolean isNeedLike(String className, String fieldName) {
  return ("ordercontactinfo".equals(className)&& "cell".equals(fieldName));
 }

 public static List<String> genMainSearchSqlString(MainSearch mainSearch){
  List<String> sqls=new ArrayList<String>();
  Field[] fs = mainSearch.getClass().getDeclaredFields();
  try{
   for(Field f:fs){
    f.setAccessible(true);
    Object value = f.get(mainSearch);
    if(null != value){
     String val = "select distinct orderId as orderid from " + value.getClass().getSimpleName().toLowerCase();
     String whereClause = genWhereClauseByObject(value);
     if(!" where 1=1".equalsIgnoreCase(whereClause))
      sqls.add(val + whereClause);
    }
    f.setAccessible(false);
   }
  }catch(Exception e){
   log.error(e);
  }
  return sqls;
 }
}

 

调用方式:

ReflectUtil.mergeObject(pnr, oldpnr);

此方法应用场景为:两个方法分别只能获取到一个vo的一部分属性但是方法中需要两个方法取到的属性值之和(这种情况主要产生在系统调用不同的接口),此时就可能这个方法。

注:两个参数都是同一种vo,如果两个vo中都取到的同一个属性值的话可能会有属性值覆盖的情况(本人没测过,使用此方法时要注意这一点)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值