关于不同对象且属性名称也不一样的两个对象之间的复制以及动态对象生成
来源:互联网 发布:大宗商品进出口数据 编辑:程序博客网 时间: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<>();
/*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());
}
}
然后写一个工具方法完成如下功能:
利用反射获得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
- 关于不同对象且属性名称也不一样的两个对象之间的复制以及动态对象生成
- 反射实现两个对象属性名不同之间的映射
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 两个具有相同属性的对象之间属性的拷贝
- 不同Context对象创建的LayoutInflater对象也不同
- 如何比较两个Oracle数据库之间对象的不同
- Java 对象之间的比较,判断两个对象的某一个属性相等,则对象相等
- java不同对象之间同名属性值复制
- 复制两个不同类的对象的属性
- 复制两个不同类的对象的属性
- 复制两个不同类的对象的属性
- Java中复制两个不同类的对象的属性
- 反射应用:比较两个对象属性的不同
- 通过反射完成不同对象之间的属性拷贝
- 对象的旅行:对象和人,两个世界,一样情怀
- 对象的旅行:对象和人,两个世界,一样情怀
- 关于Java中的对象名称以及对象
- spring-两个对象之间的属性拷贝工具
- Android 一个改善的okHttp封装库
- 图像的基本几何变换
- ios des加密与解密(对应JAVA加解密)
- servlet和jms从activemq监听消息
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
- 关于不同对象且属性名称也不一样的两个对象之间的复制以及动态对象生成
- Android版添加phonegap--ionic时间选择插件插件教程
- AS2.0大步更新 Google强势逆天
- Git SourceTree Please, commit your changes or stash them before you can merge.
- SQL学习 关于汇总函数
- 蔡氏电路混沌同步Multisim实现
- HTML之相对定位relative
- css3制作优惠券
- 利用shuffle和shared memory的reduction性能比较