簡體   English   中英

如何在java中使用反射獲取通用字段的主要類型?

[英]How to get main type of generic field with reflection in java?

假設我的項目中有以下這些類:

public class MyBaseEntity<T> {
    T   id;
}

public class MySubClass extends MyBaseEntity<Long> {

}

現在,我想用java反射MySubClassidjava.lang.Long )字段的主要類型,我該怎么做?

更新

我將類更改為此並添加了2個新Class

public class MySubClass3 extends MyBaseEntity<Integer> {

}

public class MySubClass2 extends MySubClass3 {

}

public class MySubClass extends MySubClass2 {

}

現在,如何獲取id的主要類型,換句話說,如果繼承的深度是動態的,我如何獲取特定類的id的主要類型?

將類型傳遞給基類的構造函數

public MyBaseEntity(Class<?> clazz) {
    this.clazz = clazz;
}

好吧,您可以使用以下方法在運行時中定義哪個類用於MyBaseEntityT參數:

Type type = MySubClass.class.getGenericSuperclass();
if(type instanceof ParameterizedType) {
    Type parameterType = ((ParameterizedType) type).getActualTypeArguments()[0];
    if(parameterType instanceof Class) {
        System.out.println(((Class<?>)parameterType).getName());
        // prints java.lang.Long
    }
}

但這是一種容易出錯的方法。 您可能具有更棘手的繼承性,或者使用通配符,例如class SubClass<T extends Number> extend MyBaseEntity<T> ,您將必須專門處理此類情況。 因此,我建議您使用@Reimeus建議的方法。

使用TypeTools

Class<?> type = TypeResolver.resolveRawArgument(MySubClass.class, MyBaseEntity.class);
assert type == Integer.class;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM