一、概念
注解是一系列元数据,关键字为Annotation,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。通俗点说,注解类似于标签,它堆程序没有什么直接的影响,没有它们,程序一样运行,它是用来标注一段程序的,比如@target注解,就是用来标注它所修饰的代码是类、方法、属性、或者其他。另外,注解也有属性。
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})//表示此注解可以加在方法上, @Retention(RetentionPolicy.SOURCE) @interface Test{ int age() default 0; String value() default "lemon"; } @Test(age = 10) public void eat(){ System.out.println("又到了干饭时间了!"); }
二、作用
1.提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
2.编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
3.运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
4.值得注意的是,注解不是代码本身的一部分。
三、分类
1.jdk注解:
a)@Override :用来标识重写方法,之前我们在继承那见到过
b)@Deprecated:这个注解用来标记过时的元素,编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。
c)@SuppressWarnings(“deprecation”) 忽略警告
d)@SafeVarargs jdk1.7出现,堆污染,不常用
e)@FunctionallInterface 函数式接口注解jdk1.8出现,配合函数式编程拉姆达表达式,不常用
2.元注解:可以标注在注解上的注解。
a)@Retention:Retention 的英文意为保留期的意思。也为生命周期,当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
参数:参数只能有一个,也就是三选一
- RetentionPolicy.SOURCE 源文件保留,注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS .class文件保留,注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 运行时保留,注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
b)@Target Target 是目标的意思,@Target 指定了注解运用的地方。你可以这样理解,当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。
参数:参数可以有多个,格式:{ , }
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
c)@Inherited 允许子注解继承
d)Documented 生成javadoc时会包含注解,不常用
e)@Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用