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

时间:2011-09-09 13:50:32

标签: java annotations generated-code

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

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

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

  • 生成的代码可自定义(MANDATORY)
  • 不必调用apt之类的外部工具(强制性)
  • 仅限JDK,没有第三方框架( MANDATORY 可选)
  • 注释名称可自定义(可选)

例如:

@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;
   }
}

修改
最后,我将我的第三个要求从MANDATORY转为OPTIONAL并选择了project Lombok(与Maven和Eclipse轻松集成,几乎没有工作要做  使用它。)

3 个答案:

答案 0 :(得分:14)

自版本1.6以来,annotation processing tool已集成在 javac 中,并且是part of the JDK。因此,在使用 Pluggable Annotation API 时不需要外部工具。您可以使用Mirror API分析自定义注释或方法/参数/字段/类声明来生成任何代码。

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

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

答案 1 :(得分:12)

看看Project Lombok。它会在你写的时候生成代码:

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

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

答案 2 :(得分:3)

我使用XML和XSLT生成代码。它用于EJB,Logic和视图的CRUD部分。它不是在运行时进行的,而是在构建服务器上。开发人员可以手动生成代码以进行良好的开发。这是通过ANT在buildserver上使用的相同命令完成的。

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

如果你谷歌Java code generation with XSLT,你会遇到很多例子。请注意,这种技术的历史可以追溯到2000年左右,因此现在可能已经提供了更简单的解决方案。