近期在项目中有多个vo需要进行vo、po值的转换,之前都是在vo里写个方法,进行值传递,但是这次涉及的vo较多,属性值较多,如果要对每个vo都写个传值方法,显然是费时又费力的。正好想到了之前在网上看到了运用反射机制的值传递操作,便想到了用反射机制来实现vo和po传值。
大体思路是通过反射来获取所有字段的值、getter、setter方法,然后用invoke方法调用setter方法,将vo的值一个一个的set到po里
代码如下:
private void setValueVoToPo(Object obj, UserBean bean) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// 获取实体类的所有属性,返回Field数组
Field[] field = obj.getClass().getDeclaredFields();
// 获取属性的名字
for (int i = 0; i < field.length; i++){
// 获取属性的名字
String name = field[i].getName();
// 获取属性类型
String type = field[i].getGenericType().toString();
name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
Method fieldMothod = obj.getClass().getMethod("get" + name);
//下面是将相同类型的数据,根据getter、setter方法进行值传递
if (type.equals("class java.lang.String")){
Method m = bean.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,String.class); // 如果type是类类型,则前面包含"class ",后面跟类名
m.invoke(bean,fieldMothod.invoke(obj));
}
if (type.equals("class java.lang.Integer")){
Method m = obj.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,Integer.class);
m.invoke(bean,fieldMothod.invoke(obj));
}
if (type.equals("class java.lang.Short")){
Method m = obj.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,Short.class);
m.invoke(bean,fieldMothod.invoke(obj));
}
if (type.equals("class java.lang.Double")){
Method m = obj.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,Double.class);
m.invoke(bean,fieldMothod.invoke(obj));
}
if (type.equals("class java.lang.Boolean")){
Method m = obj.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,Boolean.class);
m.invoke(bean,fieldMothod.invoke(obj));
}
if (type.equals("class java.util.Date")) {
Method m = obj.getClass().getMethod("get" + name);
m = bean.getClass().getMethod("set"+name,Date.class);
m.invoke(bean,fieldMothod.invoke(obj));
}
}
}