java - 注释处理器与字节码生成

标签 java

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

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

最佳答案

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

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

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

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

编辑:

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

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

Project Lombok (我不敢相信我之前忘记提到过)使用了很多不同颜色的魔力来利用注释处理 API 来实现更有用的东西。它很可能正是您所需要的......

关于java - 注释处理器与字节码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797100/

相关文章:

java - 虚拟机参数 : Retrieve correctly and programmatically

java - 生成的pdf文件保存在项目文件夹内

java - 使用Gson反序列化OffsetDateTime

java - 在intellij中使用java连接到数据库(postgres)

javascript - Iframe src 被 BURP Suite 拦截并更改为在 Iframe 上加载另一个 Url

java - CORS Java 服务器端实现

java - 奇怪的故障 Flappy Bird 代码

java - 什么时候用线程,什么时候用 WAR?

java - 从 Java 发送的 HTTP Post

java - 具体类实现一个接口(interface)。稍后类型转换为接口(interface)。 JVM 如何识别 Typecasted 实例?