利用Java反射 递归创建对象

最近同事问到一个涉及到Java反射的问题,整理下来如下:

 

需求:给定父对象,和map关系如下:

 

  MyObject1 myObject1 = new MyObject1();
  Map<String, Object> resultMap = new HashMap<String,Object>();
  resultMap.put("myObject1.myobject2.mysub1.name", "sub1Name");
  resultMap.put("myObject1.myobject2.mysub1.password", "111111");
  resultMap.put("myObject1.myobject2.mysub1.mobile", "13900000000");
  resultMap.put("myObject1.myobject2.mysub2.name", "sub2Name");
  resultMap.put("myObject1.myobject2.name", "object2");
  
  myObject1 = (MyObject1)ChaletUtils.getParentObject(resultMap,myObject1);
  System.out.println(myObject1.getMyobject2().getMysub1().getName());
  System.out.println(myObject1.getMyobject2().getMysub1().getPassword());
  System.out.println(myObject1.getMyobject2().getMysub1().getMobile());
  System.out.println(myObject1.getMyobject2().getMysub2().getName());
  System.out.println(myObject1.getMyobject2().getName());

 

写一个util方法,返回对象myObject1,同时上面的所有子对象如果没有则自动创建 

 

util方法如下:

 

public static Object getParentObject(Map<String,Object> resultMap, Object myObject1){
  String classMap = "";
  Iterator<String> ite = resultMap.keySet().iterator();
  while( ite.hasNext() ){
   classMap = ite.next();
   String value = (String)resultMap.get(classMap);
   classMap = classMap.replace(".", ",");
   String[] classes = classMap.split(",");
   try {
    Class temp = myObject1.getClass();
    Method[] methods = temp.getDeclaredMethods();
    
    Object[] subArray = new Object[classes.length-1];
    
    for( int i = 0; i < subArray.length; i++ ){
     if( i != subArray.length-1 ){
      subArray[i] = null;
     }
     if( i != 0 ){
      methods = subArray[i-1].getClass().getDeclaredMethods();
     }
     for( Method method : methods ){
      if( method.getName().startsWith("set") && method.getParameterTypes().length > 0 && method.getName().substring(3).equalsIgnoreCase(classes[i+1]) ){
       if( i != subArray.length -1 ){
        subArray[i] = Class.forName(method.getParameterTypes()[0].getName()).newInstance();
       }
       if( i == 0 ){
        Method getterMethod = myObject1.getClass().getMethod("get"+method.getName().substring(3), null);
        if( getterMethod.invoke(myObject1, null) != null ){
         subArray[i] = getterMethod.invoke(myObject1, null);
        }
        method.invoke(myObject1, subArray[i]);
       }else if( i == subArray.length -1  ){
        method.invoke(subArray[i-1], value);
       }else{
        Method getterMethod = subArray[i-1].getClass().getMethod("get"+method.getName().substring(3), null);
        if( getterMethod.invoke(subArray[i-1], null) != null ){
         subArray[i] = getterMethod.invoke(subArray[i-1], null);
        }
        method.invoke(subArray[i-1], subArray[i]);
       }
      }
     }
    }
    
   } catch (InstantiationException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (IllegalArgumentException e) {
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    e.printStackTrace();
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   } catch (SecurityException e) {
    e.printStackTrace();
   } catch (NoSuchMethodException e) {
    e.printStackTrace();
   }
  }
  
  return myObject1;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值