Java反射:获取具体类型的已实现通用接口

ekj*_*ekj 5 java generics reflection

说我有一个像下面这样的课程

public class AtomEntryHandler implements ConsumingHandler<AtomEntry>
{
...
}
Run Code Online (Sandbox Code Playgroud)

是否可以从AtomEntryHandler.class的类对象获取类对象AtomEntry.class?

我认为由于擦除不可能,但朋友说是的.

Chr*_*non 8

您可以获取接口和直接子类的泛型类型,但仅适用于具体实现.例如,如果您有一个List<T>实例,则由于类型擦除,您无法知道它被参数化的内容.如果类定义包含在编译时已知的参数化类型(例如,class StringList extends List<String>),则可以检索该信息.

ParameterizedType pt = (ParameterizedType)AtomEntryHandler.class.getGenericInterfaces()[0];
Class atomEntryClass = (Class)pt.getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)

  • 我在doc中读到了接口,但是如果类实现了参数化接口(并且没有显式扩展任何类),那么在转换为`ParameterizedType`时,你将得到`java.lang.Object`并抛出异常. (2认同)

Ale*_*man 5

在接口实现的情况下,我无法找到确定基类型参数的方法(这并不意味着没有)。但这已经很接近了。

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]);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

结果: class java.lang.Integer