zoukankan      html  css  js  c++  java
  • 将source类中的属性值赋给target类中对应的属性

    /**
         * 对象的属性值拷贝
         * <p>
         * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样
         * <p>
         * example:
         * <p>
         * source:
         * <p>
         * String name;
         * String address;
         * Integer age;
         * Date   birthday;
         * <p>
         * target:
         * String name;
         * String address;
         * String email
         * <p>
         * 结果: source name, address -> target name, address
         *
         * @param source
         * @param target
         */

    思路:三步走,

    第一步:获取source和target的全部属性,放入List集合中(为什么要放入List集合中,为了偷懒而已,大可以不放就是多写一层循环而已);

    第二步:比较两个类中属性名是否相等,相等的话,执行第三步,不相等,继续遍历,直到遍历结束;

    第三步:判断属性的类型是否相同,相同赋值,不相同继续遍历,直到遍历结束

    代码如下:

    public static void copy(Object s, Object t) {
            //TODO
            List<String> list_s = new ArrayList<>();
            List<String> list_t = new ArrayList<>();
            //获取s的Class对象
            Class clss = s.getClass();
            //获取t的Class对象
            Class clst = t.getClass();
            //获取s中所有属性,并加入到集合list_s中
            Field[] fields = clss.getDeclaredFields();
            for(Field ff : fields){
                list_s.add(ff.getName());
            }
            //获取t中所有属性,并加入到集合list_t中
            Field[] fieldt = clst.getDeclaredFields();
            for(Field ff : fieldt){
                list_t.add(ff.getName());
            }
            //遍历list_t集合,在list_s集合中查找是否含有t的属性,包含判断属性类型是否相同,相同赋值
            for(String ss : list_t){
                if(list_s.contains(ss)&&isEqualFieldType(s,t,ss)){
                    sCopyt(s,t,ss);
                }
            }
    
        }
    //判断二者属性类型是否相同
        public static boolean isEqualFieldType(Object o1,Object o2,String s){
            Class cls1 = o1.getClass();
            Class cls2 = o2.getClass();
            try {
                Field f1 = cls1.getDeclaredField(s);
                Field f2 = cls2.getDeclaredField(s);
                if(f1.getType().getName().equals(f2.getType().getName())){
                    return true;
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
            return false;
    
        }
    //将s中的属性值赋给t的属性值
        public static void sCopyt(Object o1,Object o2,String s){
            Class cls1 = o1.getClass();
            Class cls2 = o2.getClass();
            try {
          //获取对应的属性对象 Field f1
    = cls1.getDeclaredField(s); Field f2 = cls2.getDeclaredField(s);
          //设置可见性 f1.setAccessible(
    true); f2.setAccessible(true);
          //利用get和set方法进行赋值 f2.
    set(o2,f1.get(o1)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } }
  • 相关阅读:
    【caffe】epoch,[batch_size],iteration的含义
    OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
    OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)
    OAuth2.0学习(1-4)授权方式1-授权码模式(authorization code)
    OAuth2.0学习(1-3)OAuth2.0的参与者和流程
    OAuth2.0学习(1-1)OAuth2.0是什么?
    nodejs(1-1)
    HTTP协议扫盲(一)HTTP协议的基本概念和通讯原理
    MySql入门(2-2)创建数据库
    SpringCloud的注解:EnableEurekaClient vs EnableDiscoveryClient
  • 原文地址:https://www.cnblogs.com/du001011/p/10778133.html
Copyright © 2011-2022 走看看