java - 使用 ASM 查找 "implicit"变量的通用签名

标签 java generics bytecode java-bytecode-asm

我正在使用 ASM 4.0 构建一个依赖项搜索工具,并且发现了一个我无法解决的极端情况。我遇到的问题与识别下面代码中 MyClass 的用法有关。

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

可以使用 MethodVisitor.visitTypeInst() 来识别 ArrayList 的用法,但在该范围内没有可用的签名方法来识别泛型类型参数中的用法。 MethodVisitor.visitLocalVariable() 也不是解决方案,因为没有创建本地变量。如果局部变量被显式声明为这样:

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

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

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

感谢您的帮助!!

最佳答案

方法体中的类型参数信息在字节码生成期间被丢弃。您无法通过分析字节码来获取它。

关于java - 使用 ASM 查找 "implicit"变量的通用签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098420/

相关文章:

java - 为什么序列化需要在实现的类中提供序列版本 UID?

java - 我们如何控制Java中变量是否存在?

generics - 泛型参数丢失信息

java - 为什么在编译时不检查多重绑定(bind)泛型

java - 在 Netbeans 可视化编辑器中添加 JScrollPane

java - 弹出菜单有时不显示在屏幕上

c# - 不允许重载泛型类型参数?

java - 获取没有堆栈跟踪的 "ArrayIndexOutOfBoundsException: null"

java - 旧的编译代码是否可以从最新 jre 上的紧凑字符串中受益?

java - asm 运算符 && 或 || 中的字节码