亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從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());

}

這打?。?/p>


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 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號