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); } }