【反射机制】两个类名不同但其属性相同的对象,如何将一个对象的值赋给另外一个对象
2017-12-14 09:14
696 查看
最近公司需要用线程迁移一张表(业务表)的数据至另外一张表(备份表)中,两张表的字段一样,如何在程序中将查到的业务表数据集合转换到另外一个备份表数据集合中。
最初的想法,是新建一个一个的去赋值,但是这种方法后期如果表增加了字段将需要修改赋值的方法,舍弃了该方法。后来想到可以用反射的机制去进行赋值,下面是我的测试代码:(我们公司对象属性都是String类型)
最初的想法,是新建一个一个的去赋值,但是这种方法后期如果表增加了字段将需要修改赋值的方法,舍弃了该方法。后来想到可以用反射的机制去进行赋值,下面是我的测试代码:(我们公司对象属性都是String类型)
public class ReflectDemo { public static void main(String[] args) { List<Drug> list=new ArrayList<Drug>(); List<DrugBk> bkList=new ArrayList<DrugBk>(); orgDrugData(list);//获取业务表数据 for(int i=0;i<list.size();i++){ Drug dTemp=list.get(i); DrugBk dBk=new DrugBk(); convertObject(dTemp,dBk);//转换对象数据 bkList.add(dBk); } // for(int i=0;i<bkList.size();i++){ // System.out.println(bkList.get(i).getRecSn()+" "+bkList.get(i).getDrugName()); //} } public static void orgDrugData(List<Drug> list){ for(int i=0;i<10;i++){ Drug d=new Drug(); d.setRecSn(i+""); d.setDrugCode("CODE_"+i); d.setDrugName("药品_"+i); list.add(d); } } public static void convertObject(Object sourceObj,Object targetObj){ if (sourceObj == null || targetObj == null){ return; } Class targetClass = null; Field[] sourceFields = null; try{ targetClass = targetObj.getClass(); sourceFields = sourceObj.getClass().getDeclaredFields(); } catch (Exception e){ e.printStackTrace(); } String fieldName = ""; Class fieldType = null; for (int i = 0; i < sourceFields.length; i++){ try{ fieldName = sourceFields[i].getName(); fieldType = sourceFields[i].getType(); Field targetField = targetClass.getDeclaredField(fieldName); if (targetField != null && targetField.getType().equals(fieldType)){ Method sourceGetter =getGetMethodName(fieldName,sourceObj); Method targetSetter =getSetMethodName(fieldName,targetObj); Object fieldValue = sourceGetter.invoke(sourceObj, null); if (fieldValue != null){ targetSetter.invoke(targetObj, new Object[] { fieldValue }); } } } catch (NoSuchFieldException e){ e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } } public static Method getGetMethodName(String fieldName,Object obj) throws Exception{ try { PropertyDescriptor pd = new PropertyDescriptor(fieldName,obj.getClass()); Method getMethod = pd.getReadMethod();//获得set方法 return getMethod; } catch (IntrospectionException e) { e.printStackTrace(); } return null; } public static Method getSetMethodName(String fieldName,Object obj){ try { PropertyDescriptor pd = new PropertyDescriptor(fieldName,obj.getClass()); Method setMethod = pd.getWriteMethod();//获得set方法 return setMethod; } catch (IntrospectionException e) { e.printStackTrace(); } return null; }
相关文章推荐
- Java相同类型的两个对象比较属性值,得到不同属性的名称和对应的值,附代码实例
- java通过xstream将xml转换为java对象遇到的问题(一个对像中两个子类的类名相同)
- C#用反射实现两个类的对象之间相同属性的值的复制
- 如何利用java的反射机制动态的取得对象的属性?
- C#用反射实现两个类的对象之间相同属性的值的复制
- java使用反射机制将两个对象共有的属性进行复制value值
- 反射实现两个对象属性名不同之间的映射
- 把list中根据相同属性(合为一个),计算不同属性转化为另外一个list
- Spring Controller 如何对不同对象中相同的属性名注入不同的值
- 一个项目思路(1):用反射机制写的函数,使2个javabean相同属性一次性导入
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- 通过反射机制创建对象,类名保存到属性集
- 输出一个对象的所有属性的值,可以不用反射机制,用JSON处理更方便
- 反射应用:比较两个对象属性的不同
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 将一个对象的属性值赋给另一个对象的相同的属性 这两个对象必须都符合javaBean的标准
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 定义Person类,Person类中含有两个属性name 和age ,使用compare方法比较两个对象是否为同一个对象。假定name 和age 都相同就似为同一个对象
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
- 如何反射出对象的所有属性?