2

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

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

基本思想是,我想以与调试器相同的方式“检测”方法(尽管仅限于第一帧深度......)。

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

4

1 回答 1

0

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

你需要做什么:

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

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

于 2015-02-17T07:43:09.027 回答