我目前正在尝试创建一个单独的List<Class> classList
,其中包含对象的所有类
DemoObject.java
public class DemoObject {
private Integer id;
private String name;
private BigDecimal price;
private Boolean isActive;
private List<NestedDemoObject> nested;
}
NestedDemoObject.java
public class NestedDemoObject {
private Integer id;
private String nameNest;
private Boolean isActive;
}
我要创建的是方法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()
中的Class
,但没有任何运气。
有什么方法可以使用Reflection API从对象中获取所有嵌套类?
感谢任何帮助或指导。
答案 0 :(得分:3)
也许这会为您指明正确的方向:
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
答案 1 :(得分:3)
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.
}
});