1. 程式人生 > >【反射機制】兩個類名不同但其屬性相同的物件,如何將一個物件的值賦給另外一個物件

【反射機制】兩個類名不同但其屬性相同的物件,如何將一個物件的值賦給另外一個物件

最近公司需要用執行緒遷移一張表(業務表)的資料至另外一張表(備份表)中,兩張表的欄位一樣,如何在程式中將查到的業務表資料集合轉換到另外一個備份表資料集合中。

最初的想法,是新建一個一個的去賦值,但是這種方法後期如果表增加了欄位將需要修改賦值的方法,捨棄了該方法。後來想到可以用反射的機制去進行賦值,下面是我的測試程式碼:(我們公司物件屬性都是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;
    }