JAVA 注解-学习篇(1)

JAVA注解

Annotation(注解)是JDK1.5及之后版本引入的。字面上看是解释的意思,可是没有那么简单。java

注解能够用在这三个方面:spring

  1. 生成文档。这是最多见的,也是java 最先提供的注解。经常使用的有@see、@param、@return等,不过如今用的到比较少了。框架

  2. 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。做用就是减小配置,如今的框架基本都使用了这种配置来减小配置文件的数量,这个是咱们主要须要了解学习的,由于如今大部分框架都是使用这个的。好比spring中的@Controller等。ide

  3. 在编译时进行格式检查。如@Override 放在方法前,若是你这个方法并非覆盖了超类方法,则编译时就能检查出。函数

java.lang.annotation.*下,包含全部JDK中的注解,java.lang.annotation.Annotation 是全部注解继承的接口,而且是自动继承,不须要定义时指定,相似于全部类都自动继承Object。工具

元注解

在java.lang.annotation下定义了四个元注解;学习

1.@Retention:注解的注解,元注解之一,code

做用:定义注解的保留策略继承

用法: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 {
}

指示应该在注释元素(以及包含在该注释元素中的全部程序元素)中取消显示指定的编译器警告,表示不鼓励开发人员使用该注解标志的东西。

注意:在给定元素中取消显示的警告集是全部包含元素中取消显示的警告的超集。例如,若是注释一个类来取消显示某个警告,同时注释一个方法来取消显示另外一个警告,那么将在此方法中同时取消显示这两个警告。

相关文章
相关标签/搜索