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());
}
這打?。?/p>
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
添加回答
舉報