我正在使用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属性,但我不确定如何执行此操作。
感谢您的帮助!!
答案 0 :(得分:2)
在字节代码生成期间,将丢弃方法体中的类型参数信息。通过分析字节代码,你无法获得它。
答案 1 :(得分:0)
获取此信息的唯一方法是使用调试信息。如果它在那里你可以尝试推断局部变量的名称和类型。如果不存在,则只能根据类的使用方式推断类型。