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.