【问题标题】:Can JVM bytecode be manipulated at compile time?JVM字节码可以在编译时进行操作吗?
【发布时间】:2013-01-28 18:51:09
【问题描述】:

是否可以在编译时使用像 ASM 这样的字节码操作库?

具体来说,我想使用 Java 的注释处理 API 在带注释的类上实现繁重的样板方法。实现annotation processor 很简单,但是当Processor 运行时,.class 文件似乎还不存在。还有其他方法吗?

【问题讨论】:

标签: java compilation bytecode java-bytecode-asm


【解决方案1】:

您可能对 Javassist (http://www.jboss.org/javassist) 感兴趣,它可以在编译后步骤中增强和保存类。

本文介绍如何保存增强类:https://dzone.com/articles/implementing-build-time

特别是,一旦你改变了一个类,你可以这样做:

 compiledClass.writeFile("/tmp/modifiedClassesFolder");

【讨论】:

  • 你能详细说明一下吗?这篇文章很好地解释了JBoss,但是它使用的是Ant,你能提供一个Gradle的例子吗?
【解决方案2】:

应该可以,因为以下项目正在这样做:Project Lombok

还有:

Java 8 将带来一种新机制,允许您为 Java 编译器 (javac) 编写插件。编译器插件允许您向 javac 添加新阶段,而无需更改其代码库。新行为可以封装在插件中并分发给其他人使用。例如,javac 插件可用于执行以下操作:

• 添加额外的编译时检查

• 添加代码转换

• 对源代码进行自定义分析

【讨论】:

    【解决方案3】:

    您应该改用 CGLib。使用 CGLib,您可以使用方法拦截器添加代理,并让拦截器实现您的样板代码。另一种选择是查看 Javassist。使用 Javassist,您可以使用实际文本(在字符串中)创建一个新的子类,并让 javassist 将其编译为字节码。

    【讨论】:

    • @bmargulies 是的,它们在运行时工作,但是当它们操作字节数组时,可以用作编译后步骤来覆盖现有的 .class 文件
    猜你喜欢
    • 1970-01-01
    • 2013-06-08
    • 2023-04-08
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多