java - 从java中的对象获取类列表

标签 java class reflection

我目前正在尝试创建一个独特的 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/

相关文章:

javascript - jQuery 如何将类添加到 <li> 或 <a> 并保留在下一页加载或刷新时?

vba - 如何在 VBA 中为类模块声明静态变量?

java - 当我向其文本字段添加数字时,我的 Android 应用程序不显示任何内容

java - Java Sound API 在您的计算机上找到哪些输出和录音端口?

java - @XmlSeeAlso 也有多个参数

java - 如何检测 long 类型是否真的为 NULL?

c++ - 当类在 C++ 中被销毁时,引用属性是否被销毁?

java - 这两种构造实例方式的区别(Reflect 和 new)

java - 如何在 Java 中将 Field 转换为 Set 类?

C# - 从程序集中的文件夹中获取所有接口(interface)