代码之家  ›  专栏  ›  技术社区  ›  ahe

字节码操作模式

  •  7
  • ahe  · 技术社区  · 15 年前

    字节码操作有哪些合法用途,以及人们如何在实践中实现这些基于字节码操作的解决方案?

    更新: 我应该更清楚地说明,这个问题实际上是关于人们在字节码操作的帮助下使用什么样的模式和技术来使代码运行。

    类似于已经提到的面向方面的编程,或者即时构建代理对象和类似的技术。

    5 回复  |  直到 8 年前
        1
  •  8
  •   Marcelo Cantos    15 年前

    字节码操作允许您实现任意复杂(和有趣)的程序转换,例如:

    • 所选函数的进入/退出日志记录代码
    • 阻止某些API访问的安全转换
    • API替换,例如,在测试工具中运行代码。

    范围是无限的;这只是一个小样本。

    至于这通常是如何完成的,从 here .

        2
  •  4
  •   Michael Aaron Safyan    8 年前

    因此,可以读取字节码来实现解释器/JVM。当实现Java编译器或编译器为JVM为目标的另一语言时,可以编写/生成字节码(例如)。 Scala Jython )您可以执行字节码操作来优化字节码(如果您想要生产和销售一个字节码优化器,或者您需要它作为一个内部工具,使您公司的代码在竞争中占据优势)。在类似的情况下,您可以操作字节码,以便在分发之前将其混淆。您还可以为执行字节码操作 aspect-oriented programming ;例如,您可能希望插入钩子(可能是出于计时或日志记录的目的或其他原因),如果操作字节码比编辑所有源文件更简单或更便宜(例如,如果源代码不可用或来自许多不同的源,并非所有这些源文件都在您的控制之下或者,说服这些团队添加这样的钩子可能既费钱又费时),在这种情况下,将修改插入到最终的字节码输出中是有意义的,而不是尝试修改原始代码(可能需要上游或维护单独的分叉,或者购买源代码)。来自仅提供字节码的第三方)。

    您可以自己操作字节码,尽管有许多现有的开放源码库和框架可以这样做,包括 BCEL ASM 只是举几个例子。

        3
  •  3
  •   Esko Luontola    15 年前

    有报纸 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
  •   Jesper    15 年前

    字节码操作的一个用途是 aspect oriented programming . 在爪哇,你可以使用 AspectJ 为此。

        5
  •  0
  •   Mario Ortegón    15 年前

    一些框架如BEA KODO(Java数据对象规范的实现)使用字节码操作来“增强”普通的Java对象,并基于XML描述添加持久性逻辑。

    因此,数据库映射信息随后在字节码上自动生成。