2 回答
TA贡献1794条经验 获得超8个赞
Mark 提供的解决方案是部分正确的。您正在尝试从声明的字段中检索类的正确方法。然而,getType()方法并没有揭示泛型类型。
为了访问您应该使用的泛型类型Field.getGenericType()。它将类作为Type对象返回。该Field对象知道自己的类型(它们也不会被删除作为一个可能会误认为)。这是一个用泛型打印类型的 java 1.8+ 示例:
Arrays.stream(DemoObject.class.getDeclaredFields())
.map(Field::getGenericType)
.map(Type::getTypeName)
.distinct()
.forEach(System.out::println);
它将打印以下结果:
java.lang.Integer
java.lang.String
java.math.BigDecimal
java.lang.Boolean
java.util.List<com.eto.sandbox.NestedDemoObject>
如果您想使用泛型类型或出于任何原因解析它们,那么您可以使用以下示例:
Arrays.stream(DemoObject.class.getDeclaredFields())
.map(Field::getGenericType)
.distinct()
.forEach(type -> {
if (type instanceof Class) {
// This is a simple class
} else if (type instanceof ParameterizedType) {
// This is a generic type. You can parse its parameters recursively.
}
});
TA贡献1812条经验 获得超5个赞
也许这为您指明了正确的方向:
for (Field f : DemoObject.class.getDeclaredFields()) {
System.out.println(f.getType().getName());
}
这打印:
java.lang.Integer
java.lang.String
java.math.BigDecimal
java.lang.Boolean
java.util.List
您可以通过类似Class.forName.
我觉得很奇怪,这getDeclaredClasses对我也不起作用,我会调查一下。当我知道更多时,我会更新答案。
更新
getDeclaredClasses 打印在类中定义的类,如下所示:
class DemoObject {
private Integer id;
private String name;
private BigDecimal price;
private Boolean isActive;
private List<NestedDemoObject> nested;
public class InnerClass {
}
}
然后执行getDeclaredClasses:
for (Class<?> f : DemoObject.class.getDeclaredClasses()) {
System.out.println(f.getName());
}
打印值:
DemoObject$InnerClass
添加回答
举报