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());
        
            
        }
  • 相关阅读:
    Django如何把数据库里的html格式输出到前端
    如何修改Django中的日期和时间格式 DateTimeField
    python2.7无法安装python-ldap、django-auth-ldap
    windows10下Python如何设置环境变量
    微信小程序在开发者工具页面显示空白且控制台看不到报错信息
    CentOS7 升级 openssh 到 openssh-8.0p1版本
    CentOS系统升级OpenSSH版本
    SSL相关漏洞解决方法
    CentOS 7.4安装 MySQL数据库
    Python3 基础知识
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/10430927.html
Copyright © 2011-2022 走看看