根据反射,提取引用类型,不包含基本数据类型,以及基本数据类型的包装类,及单列集合,和双列集合
/**
* 是否为引用数据类型
*/
private static boolean isPrimitive(Class<?> clazz) {
if (clazz.equals(String.class) || ClassUtil.isBasicType(clazz)) {
return false;
}
if (clazz.isArray() && ClassUtil.isSimpleValueType(clazz.getComponentType())) {
return false;
}
return !Collection.class.isAssignableFrom(clazz) && !Map.class.isAssignableFrom(clazz);
}
/**
* 根据参数类型,获取泛型里所有的引用clazz
* 列: public List<PageResult<List<User>>> intTest(RequestEntity<Map<String, List<PageResult<User>>>> req)
* <p>
* class org.springframework.http.RequestEntity
* class aa.bb.cc.User
*
* @param type Type
* @param list list
*/
private static void getAllParameter(Type type, List<Class<?>> list) {
Class<?> c1 = TypeUtil.getClass(type);
if (type instanceof ParameterizedType) {
if (isPrimitive(c1)) {
list.add(c1);
}
Type[] ts = ((ParameterizedType) type).getActualTypeArguments();
for (Type tp : ts) {
getAllParameter(tp, list);
}
} else {
if (isPrimitive(c1)) {
list.add(c1);
}
}
}
Field listString = Primitive.class.getDeclaredField("req");
List<Class<?>> list = new ArrayList<>();
getAllParameter(listString.getGenericType(), list);
list.forEach(System.out::println);