注解
1.注解的作用
(1)生成文档
这是最常见的,也是java 最早提供的注解。
常用的有 @see @param @return 等
(2)跟踪代码依赖性,实现替代配置文件的功能
比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。
现在的框架基本都使用了这种配置来减少配置文件的数量。
(3)在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
2.实现一个简单的注解
@Retention(RetentionPolicy.RUNTIME) public @interface MyTarget { }
*@Retention(RetentionPolicy.RUNTIME)是自定义注解所必须的。
@Retention是注解的注解,称为注解的元注解。
括号里有一个枚举类型的值,即为注解内部定义的值。
打开Retention的实现:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
可以看到这里定义了一个变量value并且没有缺省值,所以不写这个value就会报错。 继续打开RetentionPolicy:
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,这三个值分别代表的是我们定义的MyTarget如何保持:
@Retention(RetentionPolicy.RUNTIME ):
注解的信息被保留在class文件(字节码文件)中当程序编译时,
会被虚拟机保留在运行时,因此可以通过反射机制读取注解的信息。
@Retention(RetentionPolicy.CLASS):
注解的信息被保留在class文件(字节码文件)中当程序编译时,
但不会被虚拟机读取在运行的时候;
@Retention(RetentionPolicy.SOURCE ):
注解的信息会被编译器丢弃 ,不会留在class文件中,
注解的信息只会留在源文件中;
除了上面提到的一个元注解意外还有三个元注解分别是:@Target,@Documented,@Inherited ,再次强调下元注解是java API提供,是专门用来定义注解的注解,其作用分别如下:
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited 允许子类继承父类中的注解。
@Target表示该注解用于什么地方,可能的值在枚举类 ElementType中,包括:
这里重点说明下:ElementType. PACKAGE。它并不是使用在一般的类中,而是用在固定的文件package-info.java中。这里需要强调命名一定是“package-info”。由于package-info.java并不是一个合法的类,使用eclipse创建类的方式会提示不合法,所以需要以创建文件的方式来创建package-info.java。
使用方式:
@AsynLog
package org.my.commons.logs.annotation; //放在包上面

浙公网安备 33010602011771号