关于不同对象且属性名称也不一样的两个对象之间的复制以及动态对象生成

来源:互联网 发布:大宗商品进出口数据 编辑:程序博客网 时间:2024/04/29 10:53
最近遇到一个问题,要完成两个对象之间的复制,也就是根据对象A的属性值生成对应的对象B。其中A与B的属性名不同,但是其实是一个东西。前后交了不同的名字而已。因为会后很多的这样的情况,不可能每一个对象都写一个方法。我寻求一种通用的方法。网上找到BeanUtils.copyProperties()等方法copy对象要求属性名一致才可以复制。。研究了一天最后自己解决。特此贴出来给同样碰到此问题的同学们分享!!思路就是,在每一个后台对象中添加与前端对象的的属性名映射表例如Map<String,string> param;param.put("name","id")..
然后写一个工具方法完成如下功能:
 利用反射获得A的属性名数组,使用new CglibBean(temp)动态生成对应的转换了属性名的Object对象。(CglibBean用法请百度)。然后使用PropertyUtils.copyProperties(k, object);完成对象复制。具体看代码自己领悟:
------------------------------------------------------------------------------------------------------------------------------------------------
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;


import com.xiao2edu.setcfg.server.entity.TeacherPeriod;
import com.xiao2edu.setcfg.server.param.StringParam1;

public class BeanConvert {
//k为对应的实体对象,J为StringParam对象,param为属性名对应表
public static Object getObject(Object k,Object j,Map<String,String> param) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
//BeanUtils.copyProperties(k, j, str);
/*BeanUtils.copyProperties(k, j);*/
//获取实体对象属性名数组
Field[] fields=j.getClass().getDeclaredFields();
//属性名,属性类型
Map<String , Class> temp=new HashMap<>();
//属性名,属性值
Map<String , String> valueParam=new HashMap<>();

for(Field f:fields){

//设置访问权限,否则不能访问私有化属性

f.setAccessible(true);

//转换属性名,属性类型

temp.put(param.get(f.getName()), Class.forName("java.lang.String"));
/*System.out.println("kanxia"+f.getName());
System.out.println("属性名"+param.get(f.getName()));
*/
String value="";
Object valueObject=f.get(j);
if(valueObject!=null){
value=valueObject.toString();
}
valueParam.put(param.get(f.getName()), value);
//System.out.println("哈哈"+valueParam.toString());

}
//System.out.println("AAA:"+temp.toString());
//根据参数数组生成CglibBean对象
CglibBean cglibBean=new CglibBean(temp);

for(Map.Entry<String, String> entry:valueParam.entrySet()){
//System.out.println(entry.getKey());
cglibBean.setValue(entry.getKey(), entry.getValue());
}
Object object=cglibBean.getObject();
//用object给K赋值
PropertyUtils.copyProperties(k, object);


return k;
}
public static  void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
TeacherPeriod teacherPeriod=new TeacherPeriod();
StringParam1 stringParam1=new StringParam1("11","22","33","44");

teacherPeriod=(TeacherPeriod) getObject( teacherPeriod ,stringParam1,teacherPeriod.getMapping());
System.out.println(stringParam1.getA());
System.out.println(teacherPeriod.toString());
}
}
0 0