如何在Java构建时使用注释动态生成代码?

2022-09-01 19:06:45

我正在寻找一种生成代码的解决方案。我已经谷歌,搜索SO和一些博客,但我没有找到一个好的解决方案。

我想在我的类上放置一个注释,在编译时,一些方法和属性会自动添加到类中。

我正在寻找的解决方案的要点:

  • 生成的代码可自定义(必填)
  • 无需调用类似外部工具(必填)apt
  • 仅限 JDK,无第三方框架(强制可选)
  • 可自定义注释名称(可选)

例如:

@Aliasable
public class MyClass {
//Some properties

// Contructor ...

// Some methods
}

编译后,我的类将如下所示:

public class MyClass {
   //Some properties
   private String alias;

   // Contructor ...

   // Some methods
   public String getAlias() {
      return alias;
   }

   public void setAlias(String alias) {
      this.alias=alias;
   }
}

编辑:
最后,我将我的第三个要求从强制性转变为可选,并选择了项目龙目岛(与Maven和Eclipse轻松集成,几乎没有任何工作要做使用它)。


答案 1

自1.6版本以来,注释处理工具已集成到javac中,并且是JDK的一部分。因此,在使用可插拔注释 API 时,不需要外部工具。您可以通过使用镜像 API 分析自定义批注或方法/参数/字段/类声明来生成任何代码。

注释处理器 API 规定您不应更改现有类。相反,您应该生成现有类的子类,并在这些子类上创建扩展方法。

似乎无论如何都可以更改类(例如,通过使用字节码操作库),尽管这与规范相反,并且可能导致其他注释处理器出现问题,并且可能无法以相同的方式与所有编译器一起使用。


答案 2

看看龙目岛计划。它会在您编写时按照您的要求生成代码:

public class MyClass {
  @Getter @Setter private String alias;
}

如果你需要它,它还可以做更多的事情。我知道你不要求任何外部工具,但你基本上会重新创建它。


推荐