0

我正在使用 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() 工作正常,因为它通过签名参数提供对泛型类型信息的访问。只有在没有声明本地变量的隐式情况下,我才能找到访问泛型类型参数的方法。

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

谢谢你的帮助!!

4

2 回答 2

2

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

于 2012-02-01T15:52:03.337 回答
0

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

于 2012-02-01T22:09:02.680 回答