由于您的使用者类声明了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>
)。您可以通过这种方式尽可能深入...