我正在使用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()
本身不会发生在其他任何地方(既没有测试,也没有使用(,因此我只能希望它(因此,上述方法(确实有效。