Java 方法体中的工具中介本地方法调用

Java 方法体中的工具中介本地方法调用,java,java-bytecode-asm,javassist,cglib,bcel,Java,Java Bytecode Asm,Javassist,Cglib,Bcel,我知道(至少使用BCEL或ASM,例如),以某种方式访问方法的局部变量是可能的。。。但是,我需要更多的东西,我想要的是: 获取此类变量的类型(或从签名转换的方式) 了解(区分)何时使用此变量(查看受影响的值或作为参数传递) 当这个变量用作参数时,要知道它传递给了哪个方法调用 在它们各自的方法调用中断开“方法链”,并获取它们的返回值,以便我可以操纵它们 其基本思想是,我希望以调试器的方式稍微“插入”方法(尽管仅限于第一帧深度…) 谢谢你的指点。 如果需要更多信息,请随时询问。这只能使用字节码级别的

我知道(至少使用BCEL或ASM,例如),以某种方式访问方法的局部变量是可能的。。。但是,我需要更多的东西,我想要的是:

  • 获取此类变量的类型(或从签名转换的方式)
  • 了解(区分)何时使用此变量(查看受影响的值或作为参数传递)
  • 当这个变量用作参数时,要知道它传递给了哪个方法调用
  • 在它们各自的方法调用中断开“方法链”,并获取它们的返回值,以便我可以操纵它们
  • 其基本思想是,我希望以调试器的方式稍微“插入”方法(尽管仅限于第一帧深度…)

    谢谢你的指点。
    如果需要更多信息,请随时询问。

    这只能使用字节码级别的API。cglib并没有公开这样的API,所以您必须在ASM、BCEL和Javassist之间进行选择,我建议您使用ASM,因为ASM具有

    您需要做的是:

  • 通过解析方法的签名,ASM提供了相应的实用程序。您可以通过其内部名称获取任何类型。您需要将这些名称映射到它们的索引
  • 查找从该索引使用的变量的任何用法

  • 然而,这是一项相当困难的任务。为了预测代码,您必须模拟方法调用。JVM是一个堆栈机器,参数可以作为任意命令链的结果放置在操作数堆栈上。因此,您必须有效地解释找到的任何字节码指令。您或多或少需要编写自己的简单解释程序,这是一项相当艰巨的任务。

    如果该方法附带了调试信息,那么会更容易。我想,如果OP希望“以调试器所做的相同方式”处理这些方法,那么这将是一条出路(这意味着不支持没有这些属性的方法)。