从Java中的对象获取类列表

时间:2018-11-01 08:23:30

标签: 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;
}

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从对象中获取所有嵌套类?

感谢任何帮助或指导。

2 个答案:

答案 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.
                }
            });