java利用反射交换两个对象中的字段相同的字段值

有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值

然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐。

这时候利用反射解决这个问题。

class TestObject1{
    private Integer age;
    private String name;
    //特有的字段
    private String weight;
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getWeight() {
        return weight;
    }
    public void setWeight(String weight) {
        this.weight = weight;
    }
    
}
class TestObject2{
    private Integer age;
    private String name;
    //特有的字段
    private String address;
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}

编写test测试类

public class Test {
        
    /**
     * origin字段向target转化
     * @param origin
     * @param target
     * @return
     */
    public static <T> T swap(Object origin,T target){
        Field[] tFs = target.getClass().getDeclaredFields();//获得属性
        Field[] oFs = origin.getClass().getDeclaredFields();//获得属性
        for(int i=0;i<tFs.length;i++){
            String tname=tFs[i].getName();
            for(int j=0;j<oFs.length;j++){
                if(oFs[j].getName().equals(tname)){
                    Object val=getValue(origin, tname);
                    setValue(target, tname, val);
                }
            }
        }
        return target;
    }
    /**
     * 
     * @param beanObj 实体类
     */
    private static Object getValue(Object beanObj,String name){
        try {
            Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性
            Class clazz = beanObj.getClass();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                String names=field.getName();
                if(!names.equals(name)){
                    continue;
                }
                // 此处应该判断beanObj,property不为null
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                if (getMethod != null) {
                    //System.out.println(beanObj+"的字段是:"+field.getName()+",类型是:"+field.getType()+",取到的值是: "+getMethod.invoke(beanObj)); 
                    return getMethod.invoke(beanObj);
                }
            }
        } catch (Exception e) {
             e.printStackTrace();
        }
        return null;
    }
    
    
    /**
     * 
     * @param beanObj 实体类
     * @param name 字段名
     * @param value 值
     */
    private static void setValue(Object beanObj,String name,Object value){
        try {
            Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性
            Class clazz = beanObj.getClass();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                String names=field.getName();
                if(!names.equals(name)){
                    continue;
                }
                
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass());
                Method setMethod = pd.getWriteMethod();
                if (setMethod != null) {
                    setMethod.invoke(beanObj, value);
                }
            }
        } catch (Exception e) {
             e.printStackTrace();
        } 
    }
    
}

 

 

 

编写main方法

 public static void main(String[] args) {
    TestObject1 test1=new TestObject1();
    test1.setAge(22);
    test1.setName("gys");
    TestObject2 test2=swap(test1,new TestObject2());
    System.out.println(test2.getName());
    
        
    }

 

posted @ 2019-02-25 14:57  思思博士  阅读(1746)  评论(1编辑  收藏  举报