【问题标题】:Generate Methods in annotation processors在注释处理器中生成方法
【发布时间】:2021-11-17 16:22:57
【问题描述】:

我有一个注解处理器,它检查用@Builder 注解的类 如果他们对每个字段都有设置器(并基于这些方法生成构建器类)。 现在可以在我的注释处理器启动之前生成这些设置方法(如果它们不存在)?

我知道注释处理器只能生成新文件,而不能操作任何现有文件。ASM 和 Javassist 等库也可以处理使用注释处理器时不存在的 .class 文件。 有什么建议吗?

【问题讨论】:

    标签: java annotation-processing javassist


    【解决方案1】:

    Project Lombok - 并注意 lombok 如何为许多开发工具(例如 IntelliJ、VSCode、Eclipse、GWT、gradle、maven、许多许多版本的 javac、NetBeans 等)包含插件和特殊工具,并且很多代码行数。

    注释处理器 API 根本不包括在现有文件中添加/更改内容的选项。因此,为什么您需要为您关心的每个平台编写此逻辑,这比听起来要容易一些,因为那里有一组有限的实际基线 java 解析器/编译器(基本上,ecj 和 javac - 最重要的是东西已经建成),例如lombok 的 VSCode 集成非常简单(因为 VSCode 使用基于 eclipse 的语言服务器,所以 VSCode 和 Eclipse 的 95% 的工作是共享的),但我在这里选择了 slightly 这个词。 p>

    换句话说,除非你想花几个人年,否则这是不可能的。或者 fork Lombok。

    免责声明:我是 Project Lombok 的核心贡献者。

    【讨论】:

    • Project Lombok 的工作方式非常酷,但它使用的魔法方法在 jdk 版本方面具有非常不可预测的未来,因为 jdk 编译器的一次更新可能会破坏它
    • 已经发布了 11 个 java 版本(lombok 仍然适用于 JDK6 以及介于两者之间的所有内容)。除非有人花时间更新它,否则 Eclipse 不会在未来的版本上“工作”。
    【解决方案2】:

    简短的回答是否定的,如果你想保持干净并远离龙目岛之类的东西,注释处理器都是关于生成新类而不改变现有类的,至于你的情况你实际上不应该做类似的事情,但是你的注释处理器应该检查setter是否存在然后你使用setter如果不是你只是分配字段直接期望字段具有适当的可见性范围,如果不是那么你得到一个编译器错误让用户知道他需要公开这些字段。

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多