24

我正在寻找生成代码的解决方案。我用谷歌搜索,在 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;
   }
}

编辑:
最后,我将我的第三个要求从 MANDATORY 变为 OPTIONAL 并选择了Lombok 项目(与 Maven 和 Eclipse 轻松集成,使用它几乎不需要做任何工作)。

4

3 回答 3

16

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

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

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

于 2011-09-09T15:35:54.657 回答
13

看看龙目岛项目。它会在您编写时生成代码:

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

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

于 2011-09-10T11:02:15.500 回答
3

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

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

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

于 2011-09-09T13:57:17.167 回答