2

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

我想要什么

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

我有什么

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

问题

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

想法

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

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

4

1 回答 1

2

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

Project Lombok 将自己作为注释处理器连接到编译过程中。但是 Lombok 不是您的普通注释处理器。通常,注释处理器只生成新的源文件,而 Lombok 修改现有的类。

我不认为通过“普通”注释处理器修改类文件是微不足道的,而是引用帖子:

Lombok 中的“hack”是,严格来说,注释处理规范不允许您修改现有类。注释处理 API 不提供更改类的 AST 的机制。Project Lombok 的聪明人通过一些未发布的 javac API 解决了这个问题。由于 Eclipse 使用内部编译器,Lombok 还需要访问 Eclipse 编译器的内部 API。

使用这些非标准注解处理 API 的缺点是每个注解处理器实现(Javac、Eclipse 或其他?)都需要以不同方式处理,并且由于它们是非标准的,它们可以跨版本中断。

如果您真的想将其用作注释处理器,请查看 Lombok 源代码,看看他们是如何做到的。但是,如果有可能以另一种方式进行(编译后步骤,使用类文件转换器的代理),那么这些其他方法中的一种将更具可移植性。

于 2013-05-13T01:30:05.253 回答