Java 官方文档中的注解示例

Java annotation example in official docs

在阅读有关注释的 Oracle 文档(对这个概念很陌生)时,我一开始就看到了以下代码片段(link 在底部)。我不清楚这个例子说明了什么。 public @interface 定义是普通接口定义的增强版吗? id()、engineer() 等是 return 如果未在接口实现中指定默认值的方法?但是实例化很混乱,它是否提供了一个接口的实现,其中 id() returns 2868724 等?也不清楚函数 travelThroughTime() 的用途。任何澄清表示赞赏:

/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
*/
 public @interface RequestForEnhancement {
   int    id();
   String synopsis();
   String engineer() default "[unassigned]"; 
   String date();    default "[unimplemented]"; 
 }

 @RequestForEnhancement(
   id       = 2868724,
   synopsis = "Enable time-travel",
   engineer = "Mr. Peabody",
   date     = "4/1/3007"
 )
 public static void travelThroughTime(Date destination) { ... }

http://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

分解您的问题:

@interface只是interface的增强版吗?: 不,@interface 正在声明与标准 interface 完全不同的东西 - 您实际上是在声明注释类型。进行此声明可以使声明的事物用作其他代码中的注释。所以声明:

 public @interface RequestForEnhancement

使注释 @RequestForEnhancement 可以在以后的代码中使用。 注释描述方法或 class 的元数据。例如,@RequestForEnhancement 注释可能会放在另一个 class 中的方法前面,以指示某些开发人员希望以某种方式更改该方法。

相比之下,声明一个interface就是声明一组函数的签名。 类 稍后实现接口必须提供这些功能的实现。

注释体中的"methods"(synopsis()engineer()等)是干什么用的?这些不是真正的方法就像您习惯于在 class 或接口定义中看到的那样。相反,这些表示您刚刚声明的注释具有的字段。方法上的 @RequestForEnhancement 注释应指示请求的方法更改是什么,并且可能需要谁来实现对方法的增强。因此字段 synopsisengineer 是可以包含在注释中的字段。

这一段是什么意思?:

@RequestForEnhancement(
  id       = 2868724,
  synopsis = "Enable time-travel",
  engineer = "Mr. Peabody",
  date     = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }

这是一个使用我们在以 @RequestForEnhancement 开头的块中声明的注释的示例。一旦定义了注释,这样的用法可能会出现在您的代码库中,在许多不同的 classes 中。在这个特定的例子中,有一个方法 travelThroughTime(Date destination) in some class 显然不能很好地工作。一些遇到该方法的开发人员认为应该通过让它做它看起来声称要做的事情(穿越时空)来改进它。该开发人员决定通过在方法上放置一个 @RequestForEnhancement 注释来反映他的请求,其中包含有关何时发出请求、预期谁进行增强等的一些信息。

当然可以,但是您如何使用注释的内容来做任何有用的事情? (我会问你一个问题:-))

所以假设我想编写一个工具来查看我所有代码中用 @RequestForEnhancement 注释的方法,并向请求中列出的工程师发送一封电子邮件,连同有关注释的信息以及增强的请求。我将如何开始?

找出哪些方法有注释以及从注释中获取值的方法的基本机制是通过Java 反射。包含注释和反射示例的教程是 here(它实际上是一般注释的好教程)。

当然,您可以使用反射从这些注释中获取信息,但是您什么时候 运行 一个工具来使用注释中的信息? (我会问你另一个) Java 使你能够定义注释处理器,在编译代码时使用注释信息。这里是 what looks like a reasonable tutorial。您还可以在 运行 时间使用注释中的信息。例如,如果您曾经使用过 JavaFX,您可能已经注意到注解会影响 运行 时间行为(将 @FXML 添加到字段有助于 JavaFX 用在您的 fxml 中定义的值)。