java对象间值传递
java开发过程中,经常会用到将对象a的属性值赋值到对象b,如果用get/set方法,开发工作量大且方法复用性低,java 反射却可以很轻松的解决这个问题,下面是具体实现
/**
* 把对象b的值赋给对象a
*
* @param a Object
* @param b Object
* @return Object
*/
public static Object transFields(Object a, Object b) {
Class c1 = a.getClass();
Class c2 = b.getClass();
Field[] fieldsDest = c1.getDeclaredFields();
Field[] fieldsOrg = c2.getDeclaredFields();
AccessibleObject.setAccessible(fieldsDest, true);
AccessibleObject.setAccessible(fieldsOrg, true);
for (int i = 0; i < fieldsDest.length; i++) {
Field f = fieldsDest[i];
Class type = f.getType();
String name = f.getName();
String typeName = type.getName();
for (int j = 0; j < fieldsOrg.length; j++) {
// 得到数据源的数据
Field f1 = fieldsOrg[j];
String name1 = f1.getName();
String typeName1 = type.getName();
// 赋值转换
if (typeName.equals(typeName1) && name1.equals(name) && !"serialVersionUID".equals(name1)) {
switch (transType(typeName, f1.getType().getName())) {
case 1:
try {
f.set(a, f1.get(b));
} catch (Exception e) {
e.printStackTrace();
}
break;
case 2:
try {
f.set(a, f1.get(b) != null ? new java.sql.Date(((java.util.Date) f1.get(b)).getTime())
: null);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 3:
try {
f.setDouble(a, f1.getDouble(b));
} catch (Exception e) {
e.printStackTrace();
}
break;
case 4:
try {
f.setInt(a, f1.getInt(b));
} catch (Exception e) {
e.printStackTrace();
}
break;
case 5:
try {
f.set(a, f1.get(b) != null ? DateUtil.fdate((String) f1.get(b)) : null);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 6:
try {
f.set(a, f1.get(b) != null ? DateUtil.fdate((java.util.Date) f1.get(b)) : null);
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
try {
f.set(a, f1.get(b));
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
}
return a;
}
/**
* 类型转换
*
* @param type Object
* @param type1
* @return int
*/
private static int transType(Object type, Object type1) {
int typecode;
typecode = 99;
if (type.equals("java.lang.String")) {
typecode = 1;
} else if (type.equals("double")) {
typecode = 3;
} else if (type.equals("int")) {
typecode = 4;
} else if (type.equals("java.util.Date") && type1.equals("java.lang.String")) {
typecode = 5;
} else if (type1.equals("java.util.Date") && type.equals("java.lang.String")) {
typecode = 6;
} else if (type.equals("java.util.Date") && type1.equals("java.util.Date")) {
typecode = 7;
}
return typecode;
}