zoukankan      html  css  js  c++  java
  • 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());
        
            
        }
  • 相关阅读:
    vmware和主机通信方法
    曾经的读书计划
    Linux下的autoconf和automake
    Nor Flash读写方法
    Linux下的动态库和静态库
    asp.net读取Xml文件到DataSet,以及DataSet保存为Xml,利用自带的强大功能
    SqlServer 2000/2005 列转行 行转列收集
    GridView 模板列 在后台获取该行某控件的值 例如批量修改
    C# DllImport的用法 调用Window的一些常用功能
    C#通用数据库操作类 支持Access/MSSql/Orale/MySql等数据库
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/10430927.html
Copyright © 2011-2022 走看看