使用ASM进行Java注释处理

时间:2013-05-12 19:16:08

标签: java assembly bytecode

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

我想要什么

  • 我不想对有问题的类进行子类化
  • 我想方法插入现有的课程
  • 我想使用ASM添加这些方法
  • 我不想手动生成 ,而是自动编译

我有什么

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

问题

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

  • 现在,要添加的方法是由接口定义的,但是使用超类,我可以有一个 do-nothing 实现,我可以在post中覆盖它。但是,这会带来很大的灵活性,但我仍然不知道如何用javac一步编译它......

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

1 个答案:

答案 0 :(得分:1)

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

  

项目Lombok将自己作为注释处理器挂钩到编译过程中。但龙目岛不是你的普通注释处理器。通常,注释处理器仅生成新的源文件,而Lombok修改现有的类。

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

  

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

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

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