Java5开始,Java开始对元数据的支持,也就是Annotation(注解/标签)
元数据:metadata:描述数据的数据
所有的Annotation都java.lang.annotation.Annotation接口的子接口,所以Annotation是一种特殊的接口(枚举也是特殊的类);
@interface Override { } ----> interface Override extends java.lang.annotation.Annotation { }
所有的枚举类都是java.lang.Enum类的子类
enum Gende { } ----> class Gender extends java.lang.Enum { }
注解被用来为程序元素(类,方法,成员变量等)设置元数据。
注解,标签,Annotation都是一体。
使用注解需要注意,必须有三方参与才有意义
1、得有注解标签;
2、被贴的程序元素(类,字段,构造器,方法等);
3、由第三方的程序来赋予注解特殊的功能(也就是Java代码);
JDK中内置的注解:
@Override 限制覆写父类方法
@Deprecate 标记已过时,不推荐使用在JDK1.5之前,使用文档注释来标记已过时;
@SuppressWarings 抑制编译器发出警告
@SuppressWarings(value=“all”)
@SafeVarargs 抑制堆污染警告(Java7开始出现的)该注解仅仅是抑制住编译器不要报警告,但是存在的风险依然存在,仅仅是不提示了而已
使用注解:
解释为什么又的注解可以贴在类上/方法上/变量上,而有些却不行。
解释为什么有的注解可以接受参数,比如@SupppressWarings(value=“all”),而有的注解却不行:可以通过查看注解的源代码,发现注解中存在抽象方法才可以使用参数
元注解:
注解的注解
@Retention:表示注解可以保存在哪一个时期,保存的时期的值,封装在RetentionPolicy枚举类中:
- 注意:一般的,自定义的注解,使用RUNTIME。(使用反射赋予注解功能)
SOURCE:注解只能存在于源文件中,编译之后,字节码文件中没有
CLASS:注解可以存在于源文件和字节码文件中,一旦加载进JVM,在JVM中不存在
RUNTIME:注解可以存在于源文件,字节码文件,JVM中
@Target:表示注解可以贴在那些位置(类,方法,构造器上等等)。位置的常量封装在ElementType枚举类中:
1、ElementType.ANNOTATION_TYPE只能修饰Annotation
2、ElementType.CONSTRUCTOR只能修饰构造方法
3、ElementType.FILED只能修饰字段(属性),包括枚举常量
4、ElementType.LOCAL)VARIABLE只能修饰局部变量
5、ElementType.METHOD只能修饰方法
6、ElementType.PACKAGE只能修饰包(极少使用)
7、ElementType.PARAMETER只能修饰参数
8、ElementType.TYPE只能修饰类,接口,枚举
@Documented:使用@Documented注解会保存到API文档中;
@Inherited:标注的标签可以被子类所继承;
获取程序元素上的注解
注解可以贴在类(class)上,方法(method)上,字段(Filed)上,构造器(Constructor)上等;
所以在Class,Method,Filed,Contructor,类中就拥有获取注解的API。
Annotation getAnnotation(Class annotationClass)
如果存在元素的指定类型的注解,则放回这些注解,否则返回null
Annotation[ ] getAnnotations() 返回此元素上存在的所有注解;
Annotation[ ] isAnnotationPresent(Class annotationClass)
判断当前成员上是否标注了某一个注解
写一个注解:
需求编写一个注解,像@Before,@After,@Test
1、先写一个标签
2、程序
3、第三方程序:给标签功能