为了账号安全,请及时绑定邮箱和手机立即绑定

从java中的对象获取类列表

从java中的对象获取类列表

繁星coding 2021-12-22 18:52:28
我目前正在尝试创建一个不同的List<Class> classList,其中包含一个对象的所有类,例如DemoObject.javapublic class DemoObject {    private Integer id;    private String name;    private BigDecimal price;    private Boolean isActive;    private List<NestedDemoObject> nested;}NestedDemoObject.javapublic 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()fromClass没有任何运气。有什么方法可以使用反射 API 从对象中获取所有嵌套类?任何帮助或方向表示赞赏。
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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.

                }

            });


查看完整回答
反对 回复 2021-12-22
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

也许这为您指明了正确的方向:


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


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信