【问题标题】:Extracting and executing an arbitrary sequence of Java bytecodes提取和执行任意 Java 字节码序列
【发布时间】:2012-04-11 22:46:37
【问题描述】:

鉴于 Java Class A 的 .class 文件,有没有办法(例如使用 BCEL、ASM 等)提取给定的字节码序列(假设它是一个基本块),将其放在单独的位置,并且然后再执行那个字节码序列?

示例: 源代码有这些行... a += b; b += 21; . .

我只能访问字节码表示。我想提取这些字节码并将它们视为黑匣子。在 A 类的指令中,而不是源代码行 'a += b;'我希望它指向这个外部黑盒 X,它包含适当的缺失字节码序列。我想向黑盒提供堆栈帧上所有必要的变量(例如,a、b 的当前值,也许是要在黑盒 X 中使用的方法参数......),然后,在执行字节码序列后,黑盒会将控制权连同新更新的帧变量一起返回给原来的 A 类...

感谢您的任何想法。

编辑:

如下所述,最合理的黑盒应该是存根类文件中的存根方法。那么问题就变成了,我如何最合理地从这个指令序列创建这个格式良好的存根类和方法,以及如何将控制权从原始 A 类转移到。理想情况下,这将在编译时“离线”完成时间。

【问题讨论】:

    标签: java assembly bytecode bytecode-manipulation bcel


    【解决方案1】:

    在符合 JVM 规范的 Java 实现上执行字节码的唯一方法是将字节码放入(格式良好的)类文件中并加载该文件。 (这意味着字节码需要包装在类文件中的“方法”中,因为这是字节码唯一可以去的地方。)

    此外,字节码必须遵守字节码验证器强制执行的所有安全规则。这将限制您执行任意序列的能力。

    如果你只是想弄清楚字节码序列的作用,你最好手动执行它,或者使用某种字节码模拟器。

    【讨论】:

      【解决方案2】:

      棘手的部分是如何识别指令序列。我可以考虑在序列的开头和结尾通过行号或一些标记方法调用来做到这一点。

      当你把它整理好后,你可以使用 ASM 的分析包来计算局部变量和堆栈槽的类型,并将它们公开为一些方法的参数,你可以在其中复制字节码序列。

      我的article from AOSD'07 应该为您提供 ASM 的良好起点。替换描述转换的方法主体和内联方法部分与您可能需要使用的非常相似。

      【讨论】:

      • 很棒的文章。 ASM 成为如此优秀的工具的一个重要原因在于其出色的文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2011-01-20
      • 2011-04-30
      • 1970-01-01
      • 2022-01-03
      • 2010-11-19
      • 2017-01-07
      相关资源
      最近更新 更多