方法体内的仪器中介本地方法调用



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

  1. 获取此类变量的类型(或从签名转换的方法)
  2. 知道(区分)何时使用此变量(要么看到其值受到影响,要么作为参数传递)
  3. 当该变量用作参数时,要知道它被传递给了哪个方法调用
  4. 在它们各自的方法调用中断开"方法链"并获取它们的返回值,以便我可以操作它们

基本想法是,我想像调试器一样"仪器化"方法(尽管仅限于第一帧深度…)

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

这只能使用字节代码级API。cglib没有公开这样一个API,因此您必须在ASM、BCEL和Javassist之间进行选择,我建议您使用具有最佳文档的ASM。

你需要做什么:

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

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

相关内容

  • 没有找到相关文章

最新更新