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

在Java中,如何在构建时使用注释动态生成代码?,java,annotations,generated-code,Java,Annotations,Generated Code,我正在寻找生成代码的解决方案。我在Google上搜索过SO和一些博客,但没有找到一个好的解决方案 我想在我的类上添加一个注释,在编译时,一些方法和属性会自动添加到类中 我正在寻找的解决方案的要点: 生成的代码可自定义(必需) 无需调用apt等外部工具(强制) 仅限JDK,无第三方框架(强制可选) 注释名称可自定义(可选) 例如: @Aliasable public class MyClass { //Some properties // Contructor ... // Some me

我正在寻找生成代码的解决方案。我在Google上搜索过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轻松集成,几乎无需做任何工作)
我使用XML和XSLT来生成代码。它用于EJB、逻辑和视图的CRUD部分。它不是在运行时生成的,而是在buildserver上生成的。开发人员可以出于开发目的手动生成代码。这与ANT在buildserver上使用的命令相同

因为生成是使用XML和XSLT的,所以它是高度可定制的

如果你用XSLT搜索Java代码生成,你会遇到很多例子。请注意,这项技术可以追溯到2000年左右,因此现在可能已经有了更简单的解决方案。

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

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

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

请看一看。当您编写以下内容时,它会根据您的要求生成代码:

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

如果你需要它,它也能做得更多。我知道您没有要求使用外部工具,但您基本上是在重新创建此工具。

Lombok确实令人印象深刻。但在它下面真的是一个很大的黑客。也许这个黑客会削弱它。谢谢你指出这一点。我没有意识到它使用了未记录的编译器API:对于作者来说,不使用任何第三方库是很重要的。@Terel确实如此,但是除了OP之外,还会有更多的人(比如你自己)阅读这个答案。也许他们会发现它很有用。我知道这很旧……但是你找到了解决这个问题的好方法吗?一些代码将非常感谢…@MarcoCastano请查看我的编辑。哦,好的,对不起…至少我在编译时根据注释创建了代码