不幸的是,核心 Java 库中的反射能力对于分析泛型类型相当差。您可以使用这些getGeneric...
方法(例如,getGenericReturnType()
),但它们的效果并不好,而且它们通常返回Type
实例而不是Class
实例。我觉得这很笨拙。
我已经编写了自己的反射 API,基于 .NET,我觉得它更加一致(特别是在涉及泛型的情况下)。考虑以下输出:
import com.strobel.reflection.Type;
interface MyGeneric<T> {
T doSomething();
}
interface Element {}
interface MyElement extends MyGeneric<Element> {}
class Main {
public static final void main(String[] args) throws NoSuchMethodException {
// prints "class java.lang.Object":
System.out.println(
MyElement.class.getMethod("doSomething").getReturnType()
);
// prints "T":
System.out.println(
MyElement.class.getMethod("doSomething").getGenericReturnType()
);
// prints "Element":
System.out.println(
Type.of(MyElement.class).getMethod("doSomething").getReturnType()
);
}
}
欢迎您使用我的图书馆。实际上,我刚刚提交了一个错误修复,导致这个示例无法正常工作(它位于develop
分支的顶端)。