注释处理在字节码生成方面的相对优点和缺点是什么(例如使用ASM)?除了实施困难之外,您为什么更喜欢其中一个?
由于评论者询问,我正在尝试自动生成抽象 getter/setter 方法的实现,但我想要一个更一般的答案。我不是在问生成 getter 和 setter 的更好方法是什么。
一些字节码生成器库包含对轻松创建 getter/setter 变量的支持,这大大简化了事情 - 您只需导入库类并编写 Java 代码。一些框架甚至可以基于字段上的简单注释自动生成 getter 和 setter(以及一大堆其他东西)。
另一方面,字节码生成通常会在编译新类时对运行时性能产生影响,尽管可以通过缓存生成的类文件来减轻这种影响。
我在注释处理方面的经历并不那么愉快。它通常需要您配置甚至修改您的构建系统,以便执行注释处理器。此外,如果您希望大量修改源代码文件,对注释处理器进行编码可能会变得非常不舒服,并且显然没有与字节码生成相同的框架/库种类。
老实说,我个人最喜欢的是尽可能使用Java 7 方法句柄——或者只是手动编写 **** getter 和 setter。
编辑:
注释处理 API 的主要问题是(据我所知)它不支持在编译时修改代码。推荐的方法似乎是生成独立的装饰器类。当然,如果您使用例如Apache Velocity,这相对容易,但最终结果几乎不一样。
有一些 hack 处理原始源文件以添加方法并重新编译,但即使获取源文件的路径也几乎是不可能的。通常涉及很多猜测,并对项目结构做出各种假设。此外,注释处理器本质上为已处理的源文件维护了一个单独的源树。
Project Lombok(我不敢相信我之前忘记提到过)使用了许多不同颜色的魔法来利用注释处理 API 来获得更有用的东西。这很可能是你所需要的......
最好的办法是使用 IDE 的加速器来生成 getter 和 setter。这样它们就会出现在源代码中。这将使阅读代码更容易,并避免调试器出现潜在问题。
创建 getter 和 setter 有点乏味,但不值得添加一大堆复杂性(和潜在的陷阱)来避免它。(如果这对你来说真的太乏味了,说服你的老板你需要一个“代码猴子”来帮助你。)