繁体   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