假设我有一个像下面这样的类
public class AtomEntryHandler implements ConsumingHandler<AtomEntry>
{
...
}
是否可以从AtomEntryHandler.class的类对象中获得类对象AtomEntry.class ?
我认为这是不可能的,因为擦除,但一个朋友说这是可能的。
您可以获得接口和直接子类的泛型类型,但仅适用于具体实现。例如,如果您有一个List<T>
实例,由于类型擦除,您无法知道它被参数化为什么。如果类定义包含编译时已知的参数化类型(例如,class StringList extends List<String>
),则可以检索该信息。
ParameterizedType pt = (ParameterizedType)AtomEntryHandler.class.getGenericInterfaces()[0];
Class atomEntryClass = (Class)pt.getActualTypeArguments()[0];
在接口实现的情况下,我无法找到确定基类型参数的方法(这并不意味着没有)。但这是最接近的了。
import java.lang.reflect.*;
public class Foo {
static class Bar<T> {
}
static class SubBar extends Bar<Integer> {
}
public static void main(String argv[]) {
ParameterizedType pt = (ParameterizedType)SubBar.class.getGenericSuperclass();
Type[] t = pt.getActualTypeArguments();
for (int i=0;i<t.length;i++) {
System.out.println(t[i]);
}
}
}
结果:class java.lang.Integer
如果您碰巧知道ConsumingHandler
是AtomEntryHandler
实现的唯一接口,并且您碰巧知道它只需要一个类型参数,您可以这样做:
interface ConsumingHandler<T> {}
class AtomEntry {}
class AtomEntryHandler implements ConsumingHandler<AtomEntry>
{
public static void main( String[] args )
{
Type[] interfaces = AtomEntryHandler.class.getGenericInterfaces();
ParameterizedType firstInterface = (ParameterizedType) interfaces[0];
Class c = (Class) firstInterface.getActualTypeArguments()[0];
System.out.println(c.getName()); // prints "AtomEntry"
}
}
否则,你可以在getGenericInterfaces()
和它们的actualTypeArguments
中寻找,直到你找到一些看起来像你要找的东西。
但是如果你发现自己需要在实际代码中这样做,要么你的设计可能出了严重的问题,要么你正在编写一些疯狂的天才模拟对象库,你不应该需要我们回答这些问题
这里有一篇博客文章详细介绍了它:Reflecting Generics
.