1.初识注解
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
注解,标签,Annotation.
----------------------------------------------------------------
所有的Annotation都是java.lang.annotation.Annotation 接口的子接口,所以Annotation是一种特殊的接口(枚举也是特殊的类);
所有的枚举类,都是java.lang.Enum类的子类.
enum Gender{}------> class Gender extends java.lang.Enum{}
注解被用来为程序元素(类,方法,成员变量等)设置元数据。
注解,标签,Annotation都是一体.
------------------------------------------------------------------
使用注解需要注意,必须有三方参与才有意义:
1):得有注解标签本身;
2):被贴的程序元素(类,字段,构造器,方法,参数上,包上等);
3):由第三方的程序使用反射的手段来赋予注解特殊的功能(也是Java代码).
2.JDK自带的注解
Java5提供的:@Override 限定覆写父类方法,只能运用于方法上.
@Deprecated 标记已过时,标识为不推荐使用的.在Java5之前,我们使用文档注释来表示该功能:
@SuppressWarings 抑制编译器发出的多种警告,自欺欺人的做法.@SuppressWarings(value="all"):可以运用到变量,方法,类上.
Java7提供的:
@SafeVarargs 抑制堆污染警告(Java7开始出现的)当方法使用了可变参数和泛型参数,可能导致堆污染.
3.元注解
使用注解的一点点疑惑:
1):为什么有的注解可以贴在类上,可以贴在方法上等之上,如:@Deprecated .
而有的注解只能贴在方法上,比如:@Override.
2):为什么有的注解可以设置参数,如:@SuppressWarings(value="all").
而有的直接却不能设置参数.
因为元注解,描述注解的注解,用来限定注解可以贴在哪些程序元素上,还可以指定注解存在的周期.)
@Retention: 表示注解可以保存在哪一个代码时期. 保存的时期的值,封装在RetentionPolicy枚举类中:
注意:一般的,自定义的注解,使用RUNTIME.(使用反射赋予注解功能)
SOUECE:注解只能存在于源文件中,一旦编译,在字节码中就消失了.
CLASS:(缺省),注解可以存在于源文件和字节码文件中,一旦加载进JVM,在JVM中就消失了.
RUNTIME:注解可以存在于源文件,字节码文件,JVM中.
@Target: 表示注解可以贴在哪些位置(类,方法上,构造器上等等).位置的常量封装在ElementType枚举类中:
ElementType.ANNOTATION_TYPE 只能修饰Annotation
ElementType.CONSTRUCTOR 只能修饰构造方法
ElementType.FIELD 只能修饰字段(属性),包括枚举常量
ElementType.LOCAL_VARIABLE 只能修饰局部变量
ElementType.METHOD 只能修饰方法
ElementType.PACKAGE 只能修饰包(极少使用)
ElementType.PARAMETER 只能修饰参数
ElementType.TYPE 只能修饰类,接口,枚举
---------------------------------------------------------------------------------------------------
@Documented: 使用@Documented标注的标签会保存到API文档中.
比如:@Deprecated注解使用了@Documented元注解,所以被@Deprecated所标注的成员,都会保持到API文档中.
@Inherited: @Inherited标注的标签可以被子类所继承.
举例: A注解使用@Inherited标注.
@A
class Animal{}
class Cat extends Animal{}
通过反射机制,可以从Cat类上获取注解A.