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