仪器中间本地方法调用方法体内

时间:2015-02-16 11:51:42

标签: java java-bytecode-asm javassist cglib bcel

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

  1. 获取此类变量的类型(或从签名转换的方式)
  2. 知道(区分)何时使用此变量(要么看到它受影响的值,要么作为参数传递)
  3. 当此变量用作参数时,要知道它传递给
  4. 的方法调用
  5. 在各自的方法调用中打破“方法链”并获取它们的返回值,以便我可以操作它们
  6. 基本的想法是,我希望以调试器的方式“调整”方法(尽管仅限于第一帧深度......)。

    任何指针都赞赏。 如果需要更多信息,请随时询问。

1 个答案:

答案 0 :(得分:0)

这只能使用字节代码级API。 cglib没有公开这样的API,你必须在ASM,BCEL和Javassist之间做出选择,我会推荐你​​有the best documentation的ASM。

您需要做什么:

  1. 解析方法的签名,ASM为此提供实用程序。您可以通过其内部名称获取任何类型。您需要将这些名称映射到其索引。
  2. 查找对该索引使用的变量的任何使用。
  3. 然而,这是一项非常困难的任务。为了预测代码,您必须模拟方法调用。 JVM是一个堆栈机器,由于任意一串命令,参数可以放在操作数堆栈上。因此,您实际上必须解释您找到的任何字节代码指令。你或多或少会需要编写自己的简单解释器,这是一项非常重要的工作。