Java 如何获取列表的泛型类型

Java 如何获取列表的泛型类型,java,bcel,Java,Bcel,我正在使用BCEL库来分析一些代码。我遇到了一个方法(getAllNames()),它的返回类型是List。我希望能够获得此方法的返回类型 我希望能够获得“Name”的完整类 我已经尝试在我的方法访问者类中使用方法,但是对于这个特定的方法,我得到了结果“java.util.List”。我想要通用类型“com.instant.Name” 该方法的签名如下所示: public List<Name> getAllNames() { ... } public List getAllName

我正在使用
BCEL
库来分析一些代码。我遇到了一个方法
(getAllNames())
,它的返回类型是
List
。我希望能够获得此方法的返回类型

我希望能够获得“Name”的完整类

我已经尝试在我的方法访问者类中使用
方法,但是对于这个特定的方法,我得到了结果“java.util.List”。我想要通用类型“com.instant.Name”

该方法的签名如下所示:

public List<Name> getAllNames() {
...
}
public List getAllNames(){
...
}
我还有一个org.apache.bcel.generic.MethodGen对象,我在使用org.apache.bcel.classfile.method访问该方法之前创建了该对象

当我尝试获取返回类型时,它再次给出“java.util.List”


我希望MethodGen.getReturnType()的输出是“com.instant.Name”,但实际输出是“java.util.List”

与某些注释相反,信息显然存在,类型擦除不会在接口级别发生-就像Eclipse/NetBeans/IntelliJ/等可以获得类成员的确切类型/返回类型一样,你也可以这样做:

public class Name {
  public List<Name> getAllNames(){return null;}

  public static void main(String[] args) throws Exception {
    Method m=Name.class.getMethod("getAllNames");
    ParameterizedType pt=(ParameterizedType)m.getGenericReturnType();
    System.out.println(pt.getActualTypeArguments()[0]);
  }
}
真正的代码表明只有一个这样的属性,循环可以在之后退出,但这让我想到了具有多个参数的类型,比如
Map
-s..

getGenericSignature()
本身在其他任何地方都不会出现(既没有测试过,也没有使用过),因此我只能希望它(因此,上面描述的方法)真正起作用。

您将无法获得它,因为泛型仅在编译时可用。它们会被擦除,并且信息不能以字节码的形式提供。这些信息将在Valhalla项目实施和发布后提供。这会给你一个开始的理由。假设您使用的是反射,其中field是list/arraylist(或其他集合)对象,这可能有一些用处。如果在运行时在对象检查器中查看,您将看到一个包含泛型类类型的集合。使用全反射(更进一步),使用
field.getAnnotatedType().getType().getClass().getDeclaredField(“actualTypeArguments”)
。我希望它能对你有所帮助。
Attribute a[]=m.getAttributes(); // where is the org.apache.bcel.classfile.Method you have
for(int i=0;i<a.length;i++)
  if(a[i] instanceof Signature)
    System.out.println(a[i]); // this is just a test of course.