4

我目前正在构建一个 API,我将要求许多开发人员使用它。其中大部分都很简单,但有几个 API 调用本质上很复杂,但应该以几乎样板的方式使用。

我想做的是在类中生成样板代码,可能通过标记一些注释,但这些生成的方法在 Eclipse/IntelliJ 中可供开发人员查看。我查看了 Javassist,但不确定运行时性质是否是一件好事。我宁愿采用编译时方法。

如果可能的话,我希望隐藏实现的代码(即我不希望开发人员尝试更改生成方法的代码,因为它们将在重新编译时被覆盖)。

整个过程是为了向开发人员和维护人员隐藏处理的复杂性,并将其仅保留在核心框架代码中。

4

2 回答 2

5

这个问题有两个部分。首先,您希望在不编写/公开样板实现的情况下使API可供开发人员使用。其次,您希望自动生成样板代码。

如果您愿意承认正在使用某些框架,则可以在不生成代码/字节码的情况下执行此操作:

  • 对于每个重要的概念,编写一个完全定义 API 的接口。
  • 现在编写实现接口但匹配非样板 API 的方法签名的相应类。您可能希望使用命名约定来配对它们。
  • 编写一个使用 Java 代理生成接口实现的工厂。代理将尽可能委托给实现。样板代码将直接在实现处理程序中实现。
  • 您可能需要各种类型的调用处理程序,在这种情况下,请考虑为这些处理程序制定命名约定
  • 如果您不喜欢逻辑和接口之间未经检查的耦合,请提取一个不包含样板 API 的超级接口。
  • 使用这些构造的逻辑将通过接口名称请求实例;工厂将知道如何实例化底层逻辑实例和调用处理程序。

另一方面,如果您不希望您的开发人员记住框架的存在,或者您需要样板实现来访问逻辑的内部,那么您需要进行代码生成/字节码操作。

操作本身可以使用自定义类加载器完成,或者在初始类加载期间使用Java Agents完成。但是,您如何使 API 可供开发人员使用?这里有一些想法:

  • 使实现类抽象,并声明将生成样板代码的抽象方法。

  • 编写样板方法的存根实现(即在方法中什么都不做void;在所有其他方法中抛出RuntimeException。)用一些注释标记这些方法。

  • 做类似于 Google Web Toolkit 所做的事情,并将样板方法声明为native. 这类似于标记方法abstract,但允许您执行诸如创建类之类的操作final

于 2012-06-26T18:35:24.347 回答
0

Java 编译器支持注释处理。您可以编写自己的处理器来生成注释所需的代码。

于 2012-06-26T18:20:37.083 回答