• 父类属性值的copy


    最近开发中遇到这样一个问题将父类的属性值copy到子类中,从而对子类添加一些其他属性。

    父类:

    package com.jalja.org.jms.test01;
    
    import java.util.Date;
    
    public class User {
        private Integer id;
        private String name;
        private Date time;
        public User() {
            super();
        }
        public User(String name, Date time) {
            super();
            this.name = name;
            this.time = time;
        }
        public User(Integer id, String name, Date time) {
            super();
            this.id = id;
            this.name = name;
            this.time = time;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Date getTime() {
            return time;
        }
        public void setTime(Date time) {
            this.time = time;
        }
    }

    子类:

    package com.jalja.org.jms.test01;
    
    public class UserVO extends User{
        private int sex;
        public int getSex() {
            return sex;
        }
        public void setSex(int sex) {
            this.sex = sex;
        }
    }
    package com.jalja.org.jms.test01;
    
    import java.lang.reflect.Field;
    import java.util.Date;
    
    public class CopyObj {
        /**
         * 我们的业务是需要在现有的类上扩展一些属性供视图层使用
         * 1、在原有类上扩展一些属性也可以实现,但这样需要在别人的代码中直接更改,个人认为不是很好。
         * 2、写一个扩展类 UserVO 继承原类  User 
         * @param args
         * @throws IllegalArgumentException
         * @throws IllegalAccessException
         */
        public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
            User user=new User("2131",new Date());
            //将父类强转为子类出现异常Exception in thread "main" java.lang.ClassCastException:
            //UserVO vo1=(UserVO) user;
            //vo1.setSex(0);
            
            UserVO vo2=(UserVO) copyObj(user,new UserVO());
            vo2.setSex(0);
            System.out.println(vo2.getName());
            
        }
        /** 子对象copy父对象的属性值
         *  copyObj 继承 targetObj 
         * @param targetObj  被copy的目标对象
         * @param copyObj  copy后的对象
         * @throws IllegalAccessException 
         * @throws IllegalArgumentException 
         */
        public static <T> T copyObj(T targetObj,T copyObj ) throws IllegalArgumentException, IllegalAccessException{
            Field [] fields=targetObj.getClass().getDeclaredFields();
            Field [] fieldsvo=copyObj.getClass().getSuperclass().getDeclaredFields();
            for(Field f:fields){
                f.setAccessible(true);
                for(Field f2:fieldsvo){
                    f2.setAccessible(true);
                    if(f.get(targetObj)!=null&& f.getName().toString().equals(f2.getName().toString())){
                        f2.set(copyObj,f.get(targetObj)) ; 
                    }
                 }
            }
            return copyObj;
        }
    }
  • 相关阅读:
    【转】Android 6.0 Marsmallow BLE : Connection Parameters
    过滤掉字符串中重复的字符
    从第一个汉字开始分割字符串
    根据年月生成日历函数
    计算两个日期之间的工作日
    根据日期返回星座
    检查给定串是否存在于由区间及点集的结合内
    将整型数字转换为大写汉字
    向左填充指定字符串
    人民币小写金额转大写
  • 原文地址:https://www.cnblogs.com/jalja/p/6823351.html
Copyright © 2020-2023  润新知