请参阅从 Java 教程跟踪中获取字段类型:反射 API。
基本上,你需要做的是获取你的类的所有java.lang.reflect.Field,
并在每个字段上调用Field#getType()
(检查下面的编辑)。要获取所有对象字段,包括公共、受保护、包和私有访问字段,只需使用 Class.getDeclaredFields() 即可
。像这样:
for (Field field : Person.class.getDeclaredFields()) {
System.out.format("Type: %s%n", field.getType());
System.out.format("GenericType: %s%n", field.getGenericType());
}
编辑:正如wowest在注释中指出的那样,您实际上需要调用Field#getGenericType()
,检查返回的Type
是否为a,然后相应地获取参数。使用 ParameterizedType#getRawType()
和 ParameterizedType#getActualTypeArgument()
分别获取 的原始类型和类型参数的数组。下面的代码演示了这一点:ParameterizedType
ParameterizedType
for (Field field : Person.class.getDeclaredFields()) {
System.out.print("Field: " + field.getName() + " - ");
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
System.out.print("Raw type: " + pType.getRawType() + " - ");
System.out.println("Type args: " + pType.getActualTypeArguments()[0]);
} else {
System.out.println("Type: " + field.getType());
}
}
并将输出:
Field: name - Type: class java.lang.String
Field: children - Raw type: interface java.util.List - Type args: class foo.Person