快速业务通道

在Eclipse 3.1中体验J2SE 5.0的新特性 第二部分 :注释类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
:2011-04-02 IBM 邹青 吴嫣 吴疆

2.2.3 注释的注释

值得注意的是,J2SE5.0还提供了四种用于注释的注释类型。有以下的四种:

1. Target:用来指定这个注释(Annotation)是为哪种类型而定义的。比如,这个类 型可能只是为method定义的。比如override,不能用@override来修饰class或者field。

比如清单11中定义了一个注释:TODO,而这个注释定义了Target为 ElementType.method。因此,TODO只能用来修饰方法,不能用来修饰类或者类变量。图5 中给出了一个非法使用TODO的例子。在MyCalculator中,定义了一个布尔型的变量 isReady,如果用TODO来修饰这个类变量的话,会出现编译错误。而用TODO来修饰方法 calculateRate(),则不会出现编译错误。这是因为TODO的定义已经规定了,只能用来修 饰方法。

清单11 Target的用法

@Target({ElementType.METHOD}) public @interface TODO {    int priority() default 0; }

图5 TODO注释的非法使用

在Eclipse 3.1中体验J2SE 5.0的新特性 第二部分 :注释类型 - 编程入门网

2.Retention:Retention的策略可以从以下三种中选取:

RetentionPolicy.SOURCE:编译器编译之后会会从class file中除去注释 (Annotation)。

Retention.CLASS:注释(Annotation)保留在class file中,但是VM不会处理。

RetentionPolicy.RUNTIME,:注释(Annotation)保留在class file,VM会进行处理。

请注意,如果你希望在运行时查找到这些注释在什么地方被用到,一定要在定义注释 的时候,选择RetentionPolicy.RUNTIME,否则即使你用注释修饰了类变量或者方法,在运 行时也没有办法获得这个信息的。

3.Documented:这个注释(Annotation)将作为public API的一部分。

4.Inherited : 假设注释(Annotation)定义的时候使用了Inherited,那么如果这个 注释(Annotation)修饰某个class,这个类的子类也被这个注释(Annotation)所修饰 。

2.3注释的应用

下面各小节显示了在哪些情况下可以使用注释以及如何使用注释。

在Eclipse 3.1中体验J2SE 5.0的新特性 第二部分 :注释类型(5)

时间:2011-04-02 IBM 邹青 吴嫣 吴疆

2.3.1动态查找注释

当我们定义好了注释以后,我们可以开发一些分析工具来解释这些注释。这里通常要 用到Java的反射特性。比如说我们希望找到某个对象/方法/域使用了哪些注释,或者获得 某个特定的注释,或者判断是否使用某个特定的注释, 我们可以参考下面这个例子。这个 例子中定义了两个注释:TODO和TOFORMATE。在MyCalculator类中,TODO用来修饰方法 calculateRate,而TOFORMATE用来修饰类变量concurrency和debitDate。而在类 TestCalculator的main函数中,通过Java反射特性,我们查找到使用这些注释的类变量和 方法。清单12-清单15分别显示这些类的定义。

清单12 TODO注释的定义

@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface TODO {    int priority() default 0; }

清单13 TOFORMATE的定义

@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface TOFORMATE { }

清单14 使用注释的类MyCalculator

public class MyCalculator {    boolean isReady;      @TOFORMATE double concurrency;    @TOFORMATE Date debitDate;    public MyCalculator() {    super();    }    @TODO    public void calculateRate(){      System.out.println("Calculating...");    } }

清单15动态查找注释

public class TestCalculator {    public static void main(String[] args) {      MyCalculator cal = new MyCalculator();      cal.calculateRate();    try {      Class c = cal.getClass();      Method[] methods = c.g

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号