Reflect to get member value

1. Writing entity classes

package com.test.domain;

public class Xzqgk {

    /**
     * 行政区代码
     */
    private String xzqdm;

    /**
     * 行政区名称
     */
    private String xzqmc;

    /**
     * 行政区地理环境
     */
    private String xzqdlhj;

    /**
     * 行政区图片(链接)
     */
    private String xzqtp;

    /**
     * 行政区行政区划
     */
    private String xzqxzqh;

    /**
     * 矿产资源简介
     */
    private String kczyjj;

    /**
     * 地质环境简介
     */
    private String dzhjjj;

    /**
     * 淡水资源简介
     */
    private String dszyjj;

    /**
     * 湿地资源简介
     */
    private String sdzyjj;

    /**
     * 经济发展简介
     */
    private String jjfzjj;

    /**
     * 人文历史-方言
     */
    private String rwlsfy;

    /**
     * 人文历史-饮食
     */
    private String rwlsys;

    /**
     * 人文历史-文物古迹
     */
    private String rwlswwgj;

    /**
     * 人文历史-风景名胜
     */
    private String rwlsfjms;


     // getter&setter

}

2. Writing an enumeration class

package com.test.emun;

public enum XzqgkEnum {

    xzqdm("行政区代码"),
    xzqmc("行政区名称"),
    xzqdlhj( "行政区地理环境"),
    xzqtp("行政区图片"),
    xzqxzqh( "行政区行政区划"),
    kczyjj( "矿产资源简介"),
    dzhjjj( "地质环境简介"),
    dszyjj( "淡水资源简介"),
    sdzyjj( "湿地资源简介"),
    jjfzjj( "经济发展简介"),
    rwlsfy( "人文历史方言"),
    rwlsys( "人文历史饮食"),
    rwlswwgj("人文历史文物古迹"),
    rwlsfjms("人文历史风景名胜");

    private String value;

    XzqgkEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

3. Referencing the reflection tool class

package com.test.util.reflect;

import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReflectUtil {

    /**
     * 获取子类及其父类的所有字段(含多继承)
     *
     * @param clazz 类
     * @param <T>   类型
     * @return 字段数组
     */
    @SuppressWarnings("unchecked")
    public static <T> Field[] getAllDeclaredFields(Class<T> clazz) {
        List<Field> tempList = new ArrayList<>();
        while (!ObjectUtils.isEmpty(clazz)) {
            Field[] declaredFields = clazz.getDeclaredFields();
            tempList.addAll(Arrays.asList(declaredFields));
            clazz = (Class<T>) clazz.getSuperclass();
        }
        Field[] allFieldArr = new Field[tempList.size()];
        tempList.toArray(allFieldArr);
        return allFieldArr;
    }

    /**
     * 获取父类的所有字段(含多继承)
     *
     * @param clazz 类
     * @param <T>   类型
     * @return 字段数组
     */
    @SuppressWarnings("unchecked")
    public static <T> Field[] getAllSuperDeclaredFields(Class<T> clazz) {
        List<Field> tempList = new ArrayList<>();
        while (!ObjectUtils.isEmpty(clazz) && !ObjectUtils.isEmpty(clazz.getSuperclass())) {
            clazz = (Class<T>) clazz.getSuperclass();
            Field[] declaredFields = clazz.getDeclaredFields();
            tempList.addAll(Arrays.asList(declaredFields));
        }
        Field[] allFieldArr = new Field[tempList.size()];
        tempList.toArray(allFieldArr);
        return allFieldArr;
    }

    public static <T, E> E copyProperties(T t, Class<E> eClass) {
        // 判断传入源数据是否为空,如果空,则抛自定义异常
        if (null == t) {
            throw new RuntimeException("数据源为空");
        }
        // 获取源对象的类的详情信息
        Class<?> sClass = t.getClass();
        // 获取源对象的所有属性
        Field[] sFields = sClass.getDeclaredFields();
        // 获取目标对象的所有属性
        Field[] tFields = eClass.getDeclaredFields();
        E target;
        try {
            // 通过类的详情信息,创建目标对象 这一步等同于UserTwo target = new UserTwo();
            target = eClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("目标对象创建失败");
        }
        // 循环取到源对象的单个属性
        for (Field sField : sFields) {
            // 循环取到目标对象的单个属性
            for (Field tField : tFields) {
                // 判断源对象的属性名、属性类型是否和目标对象的属性名、属性类型一致
                if (sField.getName().equals(tField.getName()) && sField.getGenericType().equals(tField.getGenericType())) {
                    try {
                        // 获取源对象的属性名,将属性名首字母大写,拼接如:getUsername、getId的字符串
                        String sName = sField.getName();
                        char[] sChars = sName.toCharArray();
                        sChars[0] -= 32;
                        String sMethodName = "get" + String.valueOf(sChars);
                        // 获得属性的get方法
                        Method sMethod = sClass.getMethod(sMethodName);
                        // 调用get方法
                        Object sFieldValue = sMethod.invoke(t);
                        // 获取目标对象的属性名,将属性名首字母大写,拼接如:setUsername、setId的字符串
                        String tName = tField.getName();
                        char[] tChars = tName.toCharArray();
                        tChars[0] -= 32;
                        String tMethodName = "set" + String.valueOf(tChars);
                        // 获得属性的set方法
                        Method tMethod = eClass.getMethod(tMethodName, tField.getType());
                        // 调用方法,并将源对象get方法返回值作为参数传入
                        tMethod.invoke(target, sFieldValue);
                        break;
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException(ReflectUtil.class.getName() + "调用copyProperties出现异常:" + e.getMessage());
                    }
                }
            }
        }
        // 返回集合
        return target;
    }


    public static <T, E> List<E> copyProperties(List<T> listT, Class<E> eClass) {
        // 判断传入源数据是否为空,如果空,则抛自定义异常
        if (CollectionUtils.isEmpty(listT)) {
            throw new RuntimeException("数据源为空");
        }
        List<E> listE = new ArrayList<>();
        for (T t : listT) {
            listE.add(copyProperties(t, eClass));
        }
        // 返回集合
        return listE;
    }

}

Four. Write test cases

import com.test.domain.Xzqgk;
import com.test.emun.XzqgkEnum;
import com.test.util.reflect.ReflectUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class reflect {

    public static void main(String[] args) {
        Xzqgk one = getOne();
        Field[] fields = ReflectUtil.getAllDeclaredFields(Xzqgk.class);
        for (Field field : fields) {
            String name = field.getName();  // 对象中的属性名称
            XzqgkEnum xzqgkEnum = XzqgkEnum.valueOf(name);  // 枚举类中属性名称
            char[] sChars = name.toCharArray();
            sChars[0] -= 32;
            String sMethodName = "get" + String.valueOf(sChars);
            // 获得属性的get方法
            Method sMethod = null;
            String sFieldValue = null;
            try {
                sMethod = Xzqgk.class.getMethod(sMethodName);
                // 调用get方法
                sFieldValue = (String) sMethod.invoke(one);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("名称 = " + xzqgkEnum.getValue() + " --> " + "值 = " + sFieldValue);
        }
    }

    private static Xzqgk getOne() {
        Xzqgk xzqgk = new Xzqgk();
        xzqgk.setXzqdm("行政区代码");
        xzqgk.setXzqmc("行政区名称");
        xzqgk.setXzqdlhj("行政区地理环境");
        xzqgk.setXzqtp("行政区图片(链接)");
        xzqgk.setXzqxzqh("行政区行政区划");
        xzqgk.setKczyjj("矿产资源简介");
        xzqgk.setDzhjjj("地质环境简介");
        xzqgk.setDszyjj("淡水资源简介");
        xzqgk.setSdzyjj("湿地资源简介");
        xzqgk.setJjfzjj("经济发展简介");
        xzqgk.setRwlsfy("人文历史-方言");
        xzqgk.setRwlsys("人文历史-饮食");
        xzqgk.setRwlswwgj("人文历史-文物古迹");
        xzqgk.setRwlsfjms("人文历史-风景名胜");
        return xzqgk;
    }

}

 

Guess you like

Origin blog.csdn.net/weixin_42629433/article/details/114278587