![]() |
1
8
字节码操作允许您实现任意复杂(和有趣)的程序转换,例如:
范围是无限的;这只是一个小样本。 至于这通常是如何完成的,从 here . |
![]() |
2
4
因此,可以读取字节码来实现解释器/JVM。当实现Java编译器或编译器为JVM为目标的另一语言时,可以编写/生成字节码(例如)。 Scala 和 Jython )您可以执行字节码操作来优化字节码(如果您想要生产和销售一个字节码优化器,或者您需要它作为一个内部工具,使您公司的代码在竞争中占据优势)。在类似的情况下,您可以操作字节码,以便在分发之前将其混淆。您还可以为执行字节码操作 aspect-oriented programming ;例如,您可能希望插入钩子(可能是出于计时或日志记录的目的或其他原因),如果操作字节码比编辑所有源文件更简单或更便宜(例如,如果源代码不可用或来自许多不同的源,并非所有这些源文件都在您的控制之下或者,说服这些团队添加这样的钩子可能既费钱又费时),在这种情况下,将修改插入到最终的字节码输出中是有意义的,而不是尝试修改原始代码(可能需要上游或维护单独的分叉,或者购买源代码)。来自仅提供字节码的第三方)。 |
![]() |
3
3
有报纸 Patterns of Aspect-Oriented Design (PDF)和 Aspect-Oriented Design Principles: Lessons from Object-Oriented Design (pdf)描述了AOP/字节码操作的一些模式。 我个人用字节码操作 ASM 在里面 one framework 为使用该框架的类生成一些样板代码。框架需要客户机代码的自定义equals()和hashcode()方法,因此我 generate those 通过钩住 Java Agent 它在类加载器加载类时修改字节码。我也用过很多次 CGLIB 生成动态代理(如果它计为AOP)。 |
![]() |
4
2
字节码操作的一个用途是 aspect oriented programming . 在爪哇,你可以使用 AspectJ 为此。 |
![]() |
5
0
一些框架如BEA KODO(Java数据对象规范的实现)使用字节码操作来“增强”普通的Java对象,并基于XML描述添加持久性逻辑。 因此,数据库映射信息随后在字节码上自动生成。 |