提取和执行Java字节码的任意序列

提取和执行Java字节码的任意序列,java,assembly,bytecode,bytecode-manipulation,bcel,Java,Assembly,Bytecode,Bytecode Manipulation,Bcel,给定Java类A的.class文件,是否有方法(例如使用BCEL、ASM等)提取给定的字节码序列(假设它是一个基本块),将其放置在单独的位置,然后稍后执行该字节码序列 例如: 源代码有以下行。。。 a+=b; b+=21; . 我只能访问字节码表示。我想提取那些字节码,并把它们当作一个黑匣子。在类A的指令中,而不是源行“A+=b;”我想让它指向这个外部黑盒X,它保存了适当的缺失字节码序列。我想将堆栈帧上所有必要的变量(例如,a、b的当前值,可能是黑匣子X中要使用的方法参数…)输入黑匣子,然后在

给定Java类A的.class文件,是否有方法(例如使用BCEL、ASM等)提取给定的字节码序列(假设它是一个基本块),将其放置在单独的位置,然后稍后执行该字节码序列

例如: 源代码有以下行。。。 a+=b; b+=21; .

我只能访问字节码表示。我想提取那些字节码,并把它们当作一个黑匣子。在类A的指令中,而不是源行“A+=b;”我想让它指向这个外部黑盒X,它保存了适当的缺失字节码序列。我想将堆栈帧上所有必要的变量(例如,a、b的当前值,可能是黑匣子X中要使用的方法参数…)输入黑匣子,然后在执行字节码序列后,黑匣子将控制权与新更新的帧变量一起返回到原始类a

谢谢你的建议

编辑:


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

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

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


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

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

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


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

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

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


我的建议应该给你一个很好的ASM起点。替换描述转换的方法体和内联方法部分,这些部分与您可能需要使用的转换非常相似。

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

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


我的建议应该给你一个很好的ASM起点。替换描述转换的方法正文和内联方法部分,这些部分与您可能需要使用的转换非常相似。

这篇文章很棒。ASM是一个如此好的工具的一个重要原因是因为它有优秀的文档。ASM是一个如此好的工具的一个重要原因是因为它有优秀的文档。