簡體   English   中英

反射:將聲明類的類型參數應用於字段

[英]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沒有類型變量,因此所需的所有鍵入信息將在運行時顯示。

雖然可以直接使用反射來實現您所要求的功能,但是它很快就會變得瘋狂,因此我強烈建議您使用GenTyRefGeAnTyRef (我維護的增強型分叉)。

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.

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