【问题标题】:Java annotation processing with ASM使用 ASM 处理 Java 注释
【发布时间】:2013-05-12 19:16:08
【问题描述】:

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

我想要什么

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

我有什么

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

问题

  • 我不知道何时处理 .class 文件
  • 据我所知,AbstractProcessor 方法只允许创建新的 source 文件
  • 使用ASM,我修改了.class文件,但是方法还需要我自己创建,编译器怎么编译.java文件呢?

想法

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

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

【问题讨论】:

  • 你的源文件是否尝试引用不存在的方法?那么不修改源代码或使用编译器插件就无法编译它们。
  • 问题是不能用标准的apt注解处理修改源...
  • 在 Java 8 中,集合类通过 lamda 功能得到扩展,并且为此目的,接口可以具有默认实现的功能。
  • 是的,我喜欢 Java 8,它获得了 Scala 长期以来拥有的一些不错的功能,但 Android(Harmony)没有获得它们(我认为),所以我们将被简单的旧 Java 卡住6 :(

标签: java assembly bytecode


【解决方案1】:

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

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

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

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

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

如果您真的想将其用作注释处理器,请查看 Lombok 源代码,看看他们是如何做到的。但是,如果可以采用其他方式(编译后步骤,使用类文件转换器的代理),那么其中一种方式会更便携。

【讨论】:

  • 问题在于,通过后编译步骤,它不是开箱即用的,就像标准的 apt 注释处理...
  • 我猜类文件转换不适用于 .dex 格式的 android...否则,我会接受运行时成本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多