【问题标题】:How to generate code dynamically with annotations at build time in Java?java - 如何在Java中构建时使用注释动态生成代码?
【发布时间】:2011-09-09 13:50:31
【问题描述】:

我正在寻找生成代码的解决方案。我在 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 并选择了project Lombok(易于与 Maven 和 Eclipse 集成,几乎无事可做 使用它)。

【问题讨论】:

  • 我知道这已经过时了...但是您找到解决此问题的好方法了吗?一些代码将不胜感激......
  • @MarcoCastano 请看我的编辑。
  • 哦,好吧,抱歉……至少我设法在编译时根据注释创建了代码

标签: java annotations generated-code


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    看看Project Lombok。它会在您编写时生成代码:

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

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

    【讨论】:

    • 龙目岛真是令人印象深刻。但在它下面真的是一个很大的hack。也许这个 hack 会削弱它。
    • 感谢您指出这一点。我没有意识到它使用了未记录的编译器 API:notatube.blogspot.com/2010/11/…
    • 对于作者来说,重要的是不要使用任何第三方库。
    • @Terel 确实如此,但除了 OP 之外,还会有更多的人(比如你自己)阅读这个答案。也许他们会发现它很有用。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多