JAVA注解
Annotation(注解)是JDK1.5及以后版本引入的。字面上看是解释的意思,但是没有那么简单。
注解可以用在这三个方面:
-
生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see、@param、@return等,不过现在用的到比较少了。
-
跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置,现在的框架基本都使用了这种配置来减少配置文件的数量,这个是我们主要需要了解学习的,因为现在大部分框架都是使用这个的。比如spring中的@Controller等。
-
在编译时进行格式检查。如@Override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
java.lang.annotation.*下,包含所有JDK中的注解,java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。
元注解
在java.lang.annotation下定义了四个元注解;
1.@Retention:注解的注解,元注解之一,
作用:定义注解的保留策略
用法:Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型, 这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。 RetentionPolicy有3个值:CLASS,RUNTIME,SOURCE
- 用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
- 用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
- 用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以我们自定义注解时,一般使用@Retention(RetentionPolicy.RUNTIME )。可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用。
2.@Target:也是用来修饰注解的元注解,
作用:定义注解的作用目标
用法:它有一个属性ElementType也是枚举类型,值为:ANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE,可以使用 @Target({ElementType.TYPE,ElementType.FIELD})定义多个作用目标。
- @Target(ElementType.TYPE) // 接口、类、枚举、注解
- @Target(ElementType.FIELD) // 字段、枚举的常量
- @Target(ElementType.METHOD) // 方法
- @Target(ElementType.PARAMETER) // 方法参数
- @Target(ElementType.CONSTRUCTOR) // 构造函数
- @Target(ElementType.LOCAL_VARIABLE) // 局部变量
- @Target(ElementType.ANNOTATION_TYPE) // 注解
- @Target(ElementType.PACKAGE) / // 包
3.@Documented:说明该注解将被包含在javadoc中,无属性值。
4.@Inherited:说明子类可以继承父类中的该注解,无属性值。
Annotation的工作原理
JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。
Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。
Annotation可以冲源文件、class文件或者在运行时通过反射机制多种方式被读取。
常见注解
1.@Override注解:
package java.lang
import java.lang.annotation.*
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}
这个注解是在子类继承父类是,要重写父类的方法的一个标记。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
由源码可以看出,只作用与方法中,同样注解不会被class编译,只会保留在源码中。
@Override是一个Marker annotation(类体里面没有成员),用于标识的Annotation,Annotation名称本身表示了要给工具程序的信息。
2.@Deprecated注解:
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告,表示不鼓励开发人员使用该注解标志的东西。
注意
:在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。
来源:oschina
链接:https://my.oschina.net/u/2948232/blog/791668