使用 ASM 进行 Java 注解处理

标签 java assembly bytecode

我想做一些注释处理(序列化):

我想要什么:

  • 我不想对相关类进行子类化
  • 我想插入一个方法到现有的类中
  • 我想使用ASM添加这些方法
  • 我不想手动生成它们,而是在编译时自动生成

我拥有的:

  • 注释:)
  • 使用 ASM 扫描和修改 .class 文件的代码

问题:

  • 我不知道何时处理 .class 文件
  • 据我所知,AbstractProcessor方法仅允许创建新的文件
  • 使用ASM,我修改了.class文件,但是当方法仍然需要我创建时,编译器如何编译.java文件?

想法:

  • 现在,要添加的方法是由接口(interface)定义的,但使用父类(super class),我可以有一个什么都不做的实现,我可以在后期重写它。然而,这剥夺了很大的灵活性,而且我仍然不知道如何用 javac 一步编译它......

预先感谢您提供任何提示、建议和解决方案,
直到

最佳答案

Project Lombok似乎通过注释处理器修改二进制文件。还有一篇很好的文章解释了它是如何工作的 here

Project Lombok hooks itself into the compilation process as an annotation processor. But Lombok is not your normal annotation processor. Normally, annotation processors only generate new source files whereas Lombok modifies existing classes.

我认为通过“普通”注释处理器修改类文件并不简单,但引用这篇文章:

The "hack" in Lombok is that, strictly speaking, the annotation processing spec doesn't allow you to modify existing classes. The annotation processing API doesn't provide a mechanism for changing the AST of a class. The clever people at Project Lombok got around this through some unpublished APIs of javac. Since Eclipse uses an internal compiler, Lombok also needs access to internal APIs of the Eclipse compiler.

使用这些非标准注释处理 API 的缺点是,每个注释处理器实现(Javac、Eclipse、其他?)需要进行不同的处理,并且它们可能会跨版本,因为它们是非标准的。

如果您确实想将其作为注释处理器来执行此操作,请查看 Lombok 源代码并了解他们是如何做到的。但是,如果可以采用另一种方式(编译后步骤、具有类文件转换器的代理),那么这些其他方法之一将更具可移植性。

关于使用 ASM 进行 Java 注解处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16511100/

相关文章:

java - 使用 Groovy 来 FTP 最新文件

java - QueryDsl 如何使用 exist() 返回 boolean 值

汇编 JLE jmp 指令示例

.net - 为什么反编译 .NET IL 代码如此容易?

java - Spring 集成测试不会从其他模块获取 JPA bean

java - Maven 项目中重复的 context.xml

c++ - 如何使用位运算符清除位

c - 代码是如何执行的和gcc

perl - 为什么Perl不编译为python之类的二进制文件

compiler-construction - 字节码解析指令和机器语言之间的区别?