使用ASM查找“隐式”变量的通用签名

时间:2012-02-01 15:22:40

标签: java generics bytecode java-bytecode-asm

我正在使用ASM 4.0构建一个依赖搜索工具,我找到了一个我无法解决的角落案例。我在下面的代码中与识别MyClass的用法有关。

public void aMethod() {
   new ArrayList<? extends MyClass>();
}

可以使用MethodVisitor.visitTypeInst()来标识ArrayList的用法,但该范围内没有可用的签名方法来标识泛型类型参数中的用法。 MethodVisitor.visitLocalVariable()也不是解决方案,因为没有创建本地var。如果本地var明确声明为:

public void aMethod() {
    ArrayList<? extends MyClass> list = new ArrayList<? extends MyClass>();
}

MethodVistor.visitLocalVariable()工作正常,因为它通过签名参数提供对泛型类型信息的访问。它只是在 隐式 的情况下,没有声明本地var,我找不到访问泛型类型参数的方法。

我假设有一些方法可以使用此代码的通用信息访问class属性,但我不确定如何执行此操作。

感谢您的帮助!!

2 个答案:

答案 0 :(得分:2)

在字节代码生成期间,将丢弃方法体中的类型参数信息。通过分析字节代码,你无法获得它。

答案 1 :(得分:0)

获取此信息的唯一方法是使用调试信息。如果它在那里你可以尝试推断局部变量的名称和类型。如果不存在,则只能根据类的使用方式推断类型。