Pan*_*s K 6 java reflection class
Iam当前正在尝试创建一个List<Class> classList包含对象的所有类的类。
DemoObject.java
public class DemoObject {
private Integer id;
private String name;
private BigDecimal price;
private Boolean isActive;
private List<NestedDemoObject> nested;
}
Run Code Online (Sandbox Code Playgroud)
NestedDemoObject.java
public class NestedDemoObject {
private Integer id;
private String nameNest;
private Boolean isActive;
}
Run Code Online (Sandbox Code Playgroud)
我要创建的是一种方法public List<Class> getDistinctClasses(Class cl);,您可以将其作为输入,例如DemoObject.class返回一个列表
[DemoObject.class, Integer.class, String.class, BigDecimal.class, Boolean.class, List.class, NestedDemoObject.class]
另一个例子NestedDemoObject.class是
[NestedDemoObject.class, Integer.class, String.class, Boolean.class]
我试图在没有运气的情况下使用.getDeclaredClasses()from Class。有什么方法可以使用Reflection API从对象获取所有嵌套类?
任何帮助或指导表示赞赏。
马克提供的解决方案部分正确。您尝试从声明的字段中检索类的方法是正确的。然而getType()方法并没有揭示泛型类型。
为了访问泛型类型,您应该使用Field.getGenericType()它。它将类作为Type对象返回。这些Field对象确实知道它们自己的类型(它们不会被删除,因为人们可能会错误地认为)。这是一个 java 1.8+ 示例,打印带有泛型的类型:
Arrays.stream(DemoObject.class.getDeclaredFields())
.map(Field::getGenericType)
.map(Type::getTypeName)
.distinct()
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
它将打印以下结果:
java.lang.Integer
java.lang.String
java.math.BigDecimal
java.lang.Boolean
java.util.List<com.eto.sandbox.NestedDemoObject>
Run Code Online (Sandbox Code Playgroud)
如果您想使用泛型类型或出于任何原因解析它们,那么您可以使用以下示例:
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.
}
});
Run Code Online (Sandbox Code Playgroud)