InvocationHandler
实例,实际上是来自MapperProxy
mybatis-3
实例
像这样:
public interface A<T1,T2> {}
public interface B<T4,T3> extends A<T3,T4> {}
public class C implements B<Long, String> {}
如何检索界面T2
的{{1}}的实际类型?
A
只返回((ParameterizedType)((Class)((ParameterizedType)((Class)this.getClass()
.getGenericInterfaces()[0]).getGenericInterfaces()[0]).getRawType())
.getGenericInterfaces()[0]).getActualTypeArguments()`
,但[P,E]
是我真正想要检索的内容。
当然,我们可以从这里获得实际的参数化类型:
[String, Long]
我可以在这里获得((ParameterizedType)((Class)this.getClass().getGenericInterfaces()[0])
.getGenericInterfaces()[0]).getActualTypeArguments()
。
但是如果[Long, String]
的参数化类型有不同的序列,而我真的不知道区别是什么,我怎样才能得到B
的实际类型?
答案 0 :(得分:0)
好的,经过长时间的思考和测试,这个问题的解决方案即将来临。
此解决方案最重要的一点是 B
的类型参数将作为A
有几个关键点可以解决这个问题:
B
的类型参数和类型参数的类型映射; A
的类型参数; A
的类型参数检索实际类型参数; 前一个例子的细节:
B.class.getTypeParameters()
=&gt; [T4,T3]
B.class.getActualTypeArguments()
=&gt; [Long,String]
A.class.getTypeParameters()
=&gt; [T1,T2]
A.class.getActualTypeArguments()
=&gt; [T3,T4]
A.parameterizedType[T1]
&lt; = B.typeArguments[T3]
&lt; = String
在反复执行此操作后,可以正确获取实际类型参数。