我想在Java 8中使用反射重新构造方法的签名,我遇到了一些泛型方法的问题。特别是,我没有发现任何有助于恢复模板类型声明中的“扩展”或“超级”情况的信息。
下面是一个基于已知源代码的特定测试用例:
从源代码中对方法进行签名:
public static <T extends AssertDelegateTarget> T assertThat(T assertion)
首先,是否有一种不需要解析字符串就可以重构<T extends AssertDelegateTarget> 部件的优雅方法?
以下是我通过反思获得的主要信息:
method.toString()public static org.assertj.core.api.AssertDelegateTarget org.assertj.core.api.Assertions.assertThat(org.assertj.core.api.AssertDelegateTarget)method.toGenericString()public static <T> T org.assertj.core.api.Assertions.assertThat(T)
“扩展AssertDelegateTarget”发生了什么?method.getReturnType.toString()interface org.assertj.core.api.AssertDelegateTargetmethod.getGenericParameterTypes()[0].getTypeName()T基于上述反射信息的,我可以假设T和AssertDelegateTarget之间的关系,但是如何知道它是“扩展”还是“超级”呢?
发布于 2016-02-05 21:34:33
您已经拥有了Method对象。从这里开始,获取使用 method在方法上声明的类型参数,后者返回一个TypeVariable<Method>[]。这是在方法上声明的类型参数的数组。在这种情况下,它只有一个类型参数,因此返回的数组只有一个元素。
interface有一个检索名称T、getName的方法和一个检索边界getBounds的方法。getBounds方法返回一个Type[]。您可以确保这里的任何界都是上界,因为类型变量的声明不允许使用super,只允许使用extends。
在本例中,Type变量只是AssertDelegateTarget的Class对象。
现在,您可以根据上述信息重新构造"<T extends AssertDelegateTarget>"字符串。只有在Type[]非空的情况下才使用“扩展”。如果有多个边界,您将在它们之间放置一个逗号,例如T extends Bound1, Bound2。
https://stackoverflow.com/questions/35233683
复制相似问题