在阅读关于注释的Oracle文档时(这个概念很新),我在开头看到了以下代码段(底部的链接)。我不清楚这个例子说明了什么。 public @interface定义是普通接口定义的增强版本吗?如果在接口实现中没有指定,id(),engineer()等是返回默认值的方法吗?但是实例化是令人困惑的,它提供了一个接口的实现,其中id()返回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
答案 0 :(得分:2)
打破你的问题:
@interface
仅是interface
的增强功能吗?:
不,@interface
声明与标准interface
完全不同的东西 - 您实际上是在声明注释类型。通过此声明,可以将声明的东西用作其他代码中的注释。宣言:
public @interface RequestForEnhancement
允许在以后的代码中使用注释@RequestForEnhancement
。
注释描述方法或类的元数据。例如,@RequestForEnhancement
注释可能放在另一个类的方法前面,以指示某些开发人员希望以某种方式更改该方法。
相反,声明interface
声明了一组函数的签名。稍后实现接口的类必须提供这些函数的实现。
注释正文中的“方法”(synopsis()
,engineer()
等)是什么?这些不是您习惯看到的方法在类或接口定义中。相反,这些表示您刚刚声明的注释具有的字段。方法上的@RequestForEnhancement
注释应指示对方法所请求的更改的内容,以及可能希望实现该方法的增强的人员。因此,字段synopsis
和engineer
是可以包含在注释中的字段。
此部分的含义是什么?:
@RequestForEnhancement(
id = 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }
这是使用我们在以@RequestForEnhancement
开头的块中声明的注释的示例。一旦定义了注释,像这样的用法可能会出现在你的代码库中,在许多不同的类中。在这个特定的例子中,某个类中有一个方法travelThroughTime(Date destination)
,显然效果不佳。一些开发人员认为应该通过使其按照它所声称的方式(通过时间旅行)来改进。该开发人员决定通过在方法上添加@RequestForEnhancement
注释来反映他的请求,其中包含有关何时提出请求,谁应该进行增强等的一些信息。
当然,但是你如何使用注释的内容来做任何有用的事情? (我会问你一个问题:-))
所以,我想说我想编写一个工具,查看我的所有代码,注释用@RequestForEnhancement
注释的方法,并向请求中列出的工程师发送电子邮件,以及有关注释的信息和请求增强。我该如何开始?
找出哪些方法具有注释以及从注释中获取值的方法的基本机制是通过Java reflection 。包含注释和反射示例的教程是here(它实际上是关于注释的一个很好的教程)。
当然,你可以使用反射从这些注释中获取信息,但是什么时候运行工具来使用注释中的信息? (另一个我会问你) Java提供了定义注释处理器的能力,这些处理器在编译代码时使用注释信息。这是what looks like a reasonable tutorial。您还可以在运行时使用注释中的信息。例如,如果您曾经使用过JavaFX,您可能已经注意到注释会影响运行时行为(将@FXML添加到字段有助于JavaFX使用fxml中定义的值填充该字段)。