Field[] fs = clazz.getDeclaredFields(); // 得到所有的fields
for(Field f : fs)
{
Class fieldClazz = f.getType(); // 得到field的class及类型全路径
if(fieldClazz.isPrimitive()) continue; //判断是否为基本类型
if(fieldClazz.getName().startsWith("java.lang")) continue; //getName()返回field的类型全路径;
if(fieldClazz.isAssignableFrom(List.class))
{
Type fc = f.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型
if(fc == null) continue;
if(fc instanceof ParameterizedType) // 如果是泛型参数的类型
{
ParameterizedType pt = (ParameterizedType) fc;
Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //得到泛型里的class类型对象。 如: List<User> 得到User
}
}
}
说明:
isPrimitive:是否是基本数据类型。注意:java的基本数据类型是: boolean、byte、char、short、int、long、float 、double。Boolean,Float...等不是基本数据类型。
isAssignableFrom:是否是同一个父类。AA.class.isAssignableFrom(BB.class) 表示AA是否是BB的父类。
ParameterizedType :参数化类型
getGenericSuperclass, getSuperclass, getActualTypeArguments:getSuperclass获得父类,getGenericSuperclass获得父类,包含泛型参数信息。