在阅读关于注释的Oracle文档(这个概念很新)时,我在开始时看到了下面的片段(底部的链接)。我不清楚这个例子说明了什么。公共@接口定义是普通接口定义的增强型吗?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
发布于 2015-08-28 23:15:49
要详细分析你的问题:
@interface是,这是对 interface?:的增强,@interface声明的是与标准interface完全不同的东西--本质上是声明注释类型。通过进行此声明,可以将声明的内容用作其他代码中的注释。因此,宣言:
public @interface RequestForEnhancement使注释@RequestForEnhancement能够在以后的代码中使用。注释描述方法或类的元数据。例如,@RequestForEnhancement注释可能放在另一个类的方法前面,以指示某些开发人员希望以某种方式更改该方法。
相反,声明一个interface是声明一组函数的签名。随后实现接口的类必须提供这些函数的实现。
什么是“方法”,(**synopsis()**,,,engineer()**,等)在注释主体for**中,这些方法实际上并不像您在类或接口定义中所看到的那样。相反,这些表示您刚刚声明的注释所包含的字段。方法上的@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反射。一个包含注释和反射示例的教程是这里 (它实际上是一个很好的注释教程)。
是如此确定,您可以使用反射从这些注释中获取信息,但是您什么时候会运行一个工具来使用注释中的信息呢?为您提供了定义注释处理器的能力,在编译代码时使用注释信息。这是看上去合理的教程。您还可以在运行时使用注释中的信息。例如,如果您曾经使用过JavaFX,您可能已经注意到注释会影响运行时行为(将@FXML添加到字段有助于JavaFX使用在fxml中定义的值填充该字段)。
https://stackoverflow.com/questions/32280845
复制相似问题