首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取并执行任意序列的Java字节码

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

Stack Overflow用户
提问于 2012-04-12 06:46:37
回答 2查看 501关注 0票数 0

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

示例:源代码中有以下几行...A += b;b += 21;。。

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

谢谢你的点子。

编辑:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-12 10:46:16

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

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

我的article from AOSD'07应该会给你一个很好的入门。替换描述转换的方法体和内联方法部分,这与您可能需要使用的转换非常相似。

票数 1
EN

Stack Overflow用户

发布于 2012-04-12 06:50:57

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10115051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档