最近同事问到一个涉及到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;
}