我目前正在尝试创建一个独特的 List<Class> classList
其中包含一个对象的所有类,例如
DemoObject.java
public class DemoObject {
private Integer id;
private String name;
private BigDecimal price;
private Boolean isActive;
private List<NestedDemoObject> nested;
}
嵌套演示对象.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 从对象中获取所有嵌套类?
感谢任何帮助或指导。
最佳答案
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.
}
});
关于java - 从java中的对象获取类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53097512/