[英]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.