zoukankan      html  css  js  c++  java
  • 驼峰参数、下划线["_"]参数,属性互传

    package cc.ash;
    
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.util.ObjectUtils;
    
    import java.lang.reflect.Field;
    
    public class Test {
    
        public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
    
    
            System.out.println(int.class == Integer.TYPE);
    
            Stu stu = new Stu();
            stu.setStuName("abc");
            stu.setAge(25);
            stu.setGender(5);
    
    
            Stu_ stu_ = new Stu_();
            transFormField(Stu.class, stu, Stu_.class, stu_);
    //        System.out.println("stu_ = " + stu_);
    
            Object o = transFormField(stu, Stu_.class);
            Stu_ stu_2 = (Stu_) o;
    
            Stu_ stu_1 = new Stu_();
            transFormField(stu, stu_1);
    
    //        System.out.println("stu_1 = " + stu_1);
    
        }
    
    
    
    
    
        /**
         * resource 相同字段名称(忽略下划线后)targetClass类型的实例
         * @param resource
         * @param targetClass
         * @param <R>
         * @return
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
        public static final <R> Object transFormField(R resource, Class targetClass) throws IllegalAccessException, InstantiationException {
    
            Object instance = targetClass.newInstance();
            Object target = transFormField(resource, instance);
    
            return target;
        }
    
    
        /**
         * resource 相同字段名称(忽略下划线后)的值复制给target
         * @param resource
         * @param target
         * @param <R>
         * @param <T>
         * @return
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
        public static final <R,T> T transFormField(R resource, T target) throws IllegalAccessException, InstantiationException {
    
            Class<?> resourceClass = resource.getClass();
            Class<?> targetClass = target.getClass();
    
            transFormField(resourceClass, resource, targetClass, target);
            return target;
        }
    
    
        /**
         * 驼峰参数、下划线["_"]参数,属性互传
         * @param resourceClass
         * @param resourceInstance
         * @param targetClass
         * @param targetInstance
         * @param <R>
         * @param <T>
         * @throws IllegalAccessException
         */
        public static final <R, T> void transFormField(Class resourceClass, R resourceInstance, Class targetClass, T targetInstance) throws IllegalAccessException {
    
            Field[] rFields = andSuperField(resourceClass, resourceClass.getDeclaredFields());
            Field[] tFields = andSuperField(targetClass, targetClass.getDeclaredFields());
    
            for (int i = 0; i < rFields.length; i++) {
                Field rField = rFields[i];
                String rfName = rField.getName();
                if(StringUtils.indexOf(rfName, "_") != -1) {
                    rfName = rfName.replace("_", "");
                }
    
                for (int j = 0; j < tFields.length; j++) {
                    Field tField = tFields[j];
                    String tfName = tField.getName();
                    if(StringUtils.indexOf(tfName, "_") != -1) {
                        tfName = tfName.replace("_", "");
                    }
    
    
                    //去掉"_"后属性名称相等,可赋值便复制属性值
                    if(StringUtils.equalsIgnoreCase(tfName, rfName)) {
    
                        rField.setAccessible(true);
                        Object val = rField.get(resourceInstance);
                        if(ObjectUtils.isEmpty(val)) continue;
    
                        Class<?> readClz = val.getClass();
                        Class<?> writeClz = rField.getType();
    
                        if(writeClz.isAssignableFrom(readClz) || writeClz.isPrimitive() || readClz.isPrimitive()) {
                            tField.setAccessible(true);
                            tField.set(targetInstance, val);
                        }
                    }
                }
            }
        }
    
        /**
         * 递归合并所有超类的字段
         * @param clz
         * @param fields
         * @return
         */
        public static final Field[] andSuperField(Class clz, Field[] fields) {
    
            Class superclass = clz.getSuperclass();
    
            if(superclass != Object.class) {
                Field[] sFields = superclass.getDeclaredFields();
                fields = ArrayUtils.addAll(fields, sFields);
                andSuperField(superclass, fields);
            }
    
            return fields;
        }
    
    }
    
    class Person {
    
        private int gender;
    
        public int getGender() {
            return gender;
        }
    
        public void setGender(int gender) {
            this.gender = gender;
        }
    }
    
    class Stu extends Person {
        private String stuName;
        private int age;
    
        public String getStuName() {
            return stuName;
        }
    
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    class Stu_ extends Person {
    
        private int age_ = 12;
        private String stu_name;
    
        public String getStu_name() {
            return stu_name;
        }
    
        public void setStu_name(String stu_name) {
            this.stu_name = stu_name;
        }
    
        public int getAge_() {
            return age_;
        }
    
        public void setAge_(int age_) {
            this.age_ = age_;
        }
    }
  • 相关阅读:
    方法 —— 参数传递、重载、命令行参数与可变参数
    Float型 与 Double型数据的存储方式
    交换两个变量的值
    【LeetCode-数组】螺旋矩阵(顺时针打印矩阵)
    【LeetCode-链表】二叉树展开为链表
    【LeetCode-动态规划】零钱兑换 II
    【LeetCode-树】将有序数组转换为二叉搜索树
    【LeetCode-树】从上到下打印二叉树 III
    【LeetCode-链表】相交链表
    【LeetCode-字符串】字符串转换整数 (atoi)
  • 原文地址:https://www.cnblogs.com/foolash/p/12096040.html
Copyright © 2011-2022 走看看