如何获得通用列表类型



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

我希望能够获得"名称"的完整类。

我尝试在方法访问者类中使用< Instruction.getReturnType() >方法,但是对于此特定方法,我得到了结果" java.util.list"。我想要通用类型的" com.instant.name"。

该方法的签名就像:

public List<Name> getAllNames() {
...
}

i也有一个org.apache.bcel.generic.methodgen对象,我在使用org.apache.bcel.classfile.method

访问该方法之前创建了一个org.bcel.generic.methodgen对象

当我尝试再次获得返回类型时,它会给" java.util.list"

我希望methodgen.getReturnType((的输出为" com.instant.name",但实际输出是" java.util.list"

与某些注释相反,该信息显然在那里,类型删除不会在接口级别上发生 - 就像eclipse/netbeans/intellij/etc一样。可以获取类成员的确切类型/返回类型,您也可以这样做:

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]);
  }
}

BCEL是另一个故事,我对此不熟悉,但是FieldOrMethod.java的末端,有一种称为getGenericSignature()的方法。您可能会发现它已经有用(尽管可能会产生签名(,也可以通过attributes复制内部环(您可以通过getAttributes()获取它们(,检查instanceof Signature的出现:

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.

真实的代码表明只有一个这样的属性,然后循环可以退出,但是这使我考虑了具有多个参数的类型,例如 Map -s ...
getGenericSignature()本身不会发生在其他任何地方(既没有测试,也没有使用(,因此我只能希望它(因此,上述方法(确实有效。

相关内容

  • 没有找到相关文章

最新更新