0
点赞
收藏
分享

微信扫一扫

获取属性(得到泛型里的class类型对象)

小猪肥 2022-02-18 阅读 73
java
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;

public class AnalysisObjUtil {


    private final List<String> classTypeList;

    public AnalysisObjUtil() {
        this.classTypeList = new ArrayList<>();
        this.classTypeList.add("byte");
        this.classTypeList.add(Byte.class.getTypeName());
        this.classTypeList.add("short");
        this.classTypeList.add(Short.class.getTypeName());
        this.classTypeList.add("int");
        this.classTypeList.add(Integer.class.getTypeName());
        this.classTypeList.add("long");
        this.classTypeList.add(Long.class.getTypeName());
        this.classTypeList.add("float");
        this.classTypeList.add(Float.class.getTypeName());
        this.classTypeList.add("double");
        this.classTypeList.add(Double.class.getTypeName());
        this.classTypeList.add("char");
        this.classTypeList.add(Character.class.getTypeName());
        this.classTypeList.add("boolean");
        this.classTypeList.add(Boolean.class.getTypeName());

        this.classTypeList.add(String.class.getTypeName());
    }

    public LinkedHashMap<String, Object> scanField(Object obj) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        LinkedHashMap<String, Object> map = new LinkedHashMap<>();

        LinkedHashMap<String, String> fieldNameAndTypeMap = this.getFieldNameAndTypeMap(obj);
        Set<String> keySet = fieldNameAndTypeMap.keySet();
        for (String fieldName : keySet) {
            String fieldType = fieldNameAndTypeMap.get(fieldName);
            if (this.classTypeList.contains(fieldType)) {
                map.put(fieldName, fieldType);
            } else {
                //如果不是Java八大类型和其包装类(有可能是集合,或者Map)
                Field field = this.getFieldByName(obj, fieldName);
                if (field == null) throw new IllegalArgumentException();
                Class<?> type = field.getType();
                if (type.equals(List.class)) {
                    Type genericType = field.getGenericType();
                    if (genericType instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) genericType;
                        // 得到泛型里的class类型对象
                        Class<?> genericClass = (Class<?>) pt.getActualTypeArguments()[0];
                        Object genericObj = genericClass.newInstance();
                        List<Map<String, Object>> tmpMap = new ArrayList<>();
                        tmpMap.add(scanField(genericObj));
                        map.put(fieldName, tmpMap);
                    }
                }
            }
        }

        return map;
    }

    public LinkedHashMap<String, String> getFieldNameAndTypeMap(Object obj) {
        LinkedHashMap<String, String> map = new LinkedHashMap<>();
        Class<?> aClass = obj.getClass();
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            map.put(field.getName(), field.getType().getTypeName());
        }
        return map;
    }

    public Field getFieldByName(Object obj, String name) throws NoSuchFieldException {
        return obj.getClass().getDeclaredField(name);
    }


}
举报

相关推荐

0 条评论