Java Review(三十五、注解)
@ 目录
注解能被用来为程序元素( 类、 方法、 成员变量等) 设置元数据。 值得指出的是, 注解不影响程序代码的执行, 无论增加、 删除注解, 代码都始终如一地执行。 如果希望让程序中的注解在运行时起一定的作用, 只有通过某种配套的工具对注解中的信息进行访问和处理, 访问和处理注解的工具统称 APT( Annotation Processing Tool )。 基本注解Java 提供了5 个基本注解:
JDK 的元注解JDK 除在 java.lang下提供 5 个基本的注解之外, 还在 java.lang.annotation 包下提供了 6 个 Meta 注解 ( 元注解), 其中有 5 个元注解都用于修饰其他的注解定义。 @Retention@Retention 只能用于修饰注解定义, 用于指定被修饰的注解可以保留多长时间, @Retention 包含一个 RetentionPolicy 类型的 value 成员变量, 所以使用@Retention 时必须为该 value 成员变量指定值。 value 成员变量的值只能是如下三个:
如 果 需 要 通 过 反 射 获 取 注 解 信 息 , 就 需 要 使 用 value 属 性 值 为 RetentionPolicy.RUNTIME 的@Retention。 使用@Retention 元注解可釆用如下代码为 value 指定值:
也可采用如下代码来为 value 指定值:
@Target@Target 也只能修饰注解定义, 它用于指定被修饰的注解能用于修饰哪些程序单元。 @Target 元注解也包含一个名为 value 的成员变量, 该成员变量的值只能是如下几个:
如下代码指定@ActionListenerFor 注解只能修饰成员变量:
如下代码片段指定@Testable 注解只能修饰方法:
@Documented?Documented 用于指定被该元注解修饰的注解类将被 javadoc 工具提取成文档, 如果定义注解类时使用了?Documented 修饰, 则所有使用该注解修饰的程序元素的 API 文档中将会包含该注解说明。
@lnherited?Inherited 元注解指定被它修饰的注解将具有继承性—如果某个类使用7@Xxx 注解( 定义该注解时使用了@Inherited 修饰) 修饰, 则其子类将自动被@Xxx 修饰。
自定义注解Java语言使用@interface语法来定义注解(Annotation),格式如下:
在默认情况下, 注解可用于修饰任何程序元素, 包括类、 接口、 方法等, 如下程序使用@Test 来修饰方法:
注解不仅可以是这种简单的注解, 还可以带成员变量, 成员变量在注解定义中以无形参的方法形式来声明, 其方法名和返回值定义了该成员变量的名字和类型。 如下代码可以定义一个有成员变量的注解:
注解的参数类似无参数方法,可以用default设定一个默认值(强烈推荐)。最常用的参数应当命名为value:
也可以在使用 MyTag 注解时为成员变量指定值, 如果为 MyTag 的成员变量指定了值, 则默认值不会起作用:
通常会用元注解去修饰自定义注解,如上文所示。
提取注解信息使用注解修饰了类、 方法、 成员变量等成员之后, 这些注解不会自己生效, 必须由开发者提供相应的工具来提取并处理注解信息。 因为注解定义后也是一种class,所有的注解都继承自 java.lang.annotation.Annotation,因此,读取注解,需要使用反射API。 Java提供的使用反射API读取Annotation的方法包括: 判断某个注解是否存在于Class、Field、Method或Constructor:
例如:
使用反射API读取Annotation:
例如:
使用反射API读取Annotation有两种方法。方法一是先判断Annotation是否存在,如果存在,就直接读取:
第二种方法是直接读取Annotation,如果Annotation不存在,将返回null:
读取方法、字段和构造方法的Annotation和Class类似。但要读取方法参数的Annotation就比较麻烦一点,因为方法参数本身可以看成一个数组,而每个参数又可以定义多个注解,所以,一次获取方法参数的所有注解就必须用一个二维数组来表示。例如,对于以下方法定义的注解:
要读取方法参数的注解,我们先用反射获取Method实例,然后读取方法参数的所有注解:
使用注解实例Demo1注解@Testable 没有任何成员变量,仅是一个标记注解,它的作用是标记哪些方法是可测试的:
如下 MyTest 测试用例中定义了 8 个方法, 这 8 个方法没有太大的区别, 其中 4 个方法使用@Testable注解来标记这些方法是可测试的:
Demo2@Range注解,我们希望用它来定义一个String字段的规则——字段长度满足@Range的参数定义:
在某个JavaBean中,使用注解:
定义了注解,本身对程序逻辑没有任何影响。必须编写代码来使用注解。这里,编写一个Person实例的检查方法,它可以检查Person实例的String字段长度是否满足@Range的定义:
参考: 【1】:《疯狂Java讲义》 (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |