注释处理器与字节码生成

时间:2013-02-10 11:14:00

标签: java

annotation processing关于字节码生成的相对优缺点(例如ASM)是什么?除了实施困难之外,为什么你更喜欢一个而不是另一个?

由于评论者问,我正在尝试自动生成抽象getter / setter方法的实现,但我想要一个更一般的答案。 我不是在问什么是生成getter和setter的更好方法。

2 个答案:

答案 0 :(得分:1)

一些字节码生成器库包含对轻松创建getter / setter变量的支持,这极大地简化了事情 - 您只需导入库类并编写Java代码。一些框架甚至可以根据字段上的简单注释自动生成getter和setter(以及一大堆其他东西)。

另一方面,字节码生成通常会在编译新类时产生运行时性能影响,尽管可以通过缓存生成的类文件来缓解这种影响。

我对注释处理的经验并不是那么令人愉快。它通常要求您配置甚至修改构建系统,以便执行注释处理器。此外,如果您希望广泛修改源代码文件,编码注释处理器可能会变得非常不舒服,并且显然没有与生成字节码相同的框架/库类型。

老实说,我个人最喜欢的是在可能的情况下使用Java 7 method handles - 或者只是手工编写**** getter和setter。

修改

注释处理API的主要问题是(据我所知)它在编译时不支持修改代码。推荐的方法似乎是生成独立的装饰器类。当然,如果您使用例如,这是相对容易的Apache Velocity但最终结果并不完全相同。

有些hacks处理原始源文件以添加方法并重新编译,但即使获取源文件的路径也几乎是不可能的。通常会涉及很多猜测,对项目结构进行各种假设。此外,注释处理器本质上为已处理的源文件维护一个单独的源树。

Project Lombok(我不敢相信我之前忘记提及)使用了各种颜色的魔法来利用注释处理API来获得更多可用的东西。它很可能就是你需要的......

答案 1 :(得分:0)

最好的办法是使用IDE的加速器来生成getter和setter。这样他们就会出现在源代码中。这将使您更容易阅读代码并避免调试器的潜在问题。

创建getter和setter有点单调乏味,但不值得添加一大堆复杂性(和潜在的陷阱)来避免它。 (如果真的对你来说太单调乏味,请说服你的老板你需要一个“代码猴”来帮助你。)