[英]Reflection: Applying type parameters of declaring class to fields
我有下面的類結構:
class A<T,R> {
B<R> b;
......
}
class B<R> {
R t;
}
class StringConsumer {
A<String, String> a;
}
class LongConsumer {
A<Long, Long> a;
}
假設我有一個consumer類的實例,是否有可能獲得consumer.ab
的類型參數? 我發現如果將a
聲明為StringA a;
則可以解決相同問題StringA a;
其中class StringA extends A<String, String>
使用TypeTools
由於您的使用者類聲明的字段a
沒有類型變量,因此所需的所有鍵入信息將在運行時顯示。
雖然可以直接使用反射來實現您所要求的功能,但是它很快就會變得瘋狂,因此我強烈建議您使用GenTyRef或GeAnTyRef (我維護的增強型分叉)。
StringConsumer consumer = new StringConsumer(); //Or LongConsumer
Field a = consumer.getClass().getDeclaredField("a");
//typeOfA represents A<String, String>
ParameterizedType typeOfA = (ParameterizedType) GenericTypeReflector.getExactFieldType(a, consumer.getClass());
Type[] args = typeOfA.getActualTypeArguments();
System.out.println(args[0]); //String
System.out.println(args[1]); //String
Field b = A.class.getDeclaredField("b");
//or if you need it dynamic ((Class)typeOfA.getRawType()).getDeclaredField("b")
//or GenericTypeReflector.erase(typeOfA).getDeclaredField("b")
//typeOfB represents B<String>
ParameterizedType typeOfB = (ParameterizedType) GenericTypeReflector.getExactFieldType(b, typeOfA);
System.out.println(typeOfB.getActualTypeArguments()[0]); //String again
因此,您要做的就是從StringConsumer
開始,獲取其字段a
的類型( typeOfA
,這是A<String, String>
),然后使用該信息獲取字段b
的類型( typeOfB
,這是B<String>
)。 通過這種方式,您可以根據需要進行更深入的操作...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.