注解:
- 概念:说明程序的。给计算机看的。
- 注释:用文字描述程序的。给程序员看的。
- 定义:注解(Annotation),也叫元数据。以中代码级别的说明。他是JDK1.5及以后版本引入的一个新特性,与类、接口、枚举是在同一个层次。他可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
- 概念描述:
-
JDK1.5之后的新特性
-
说明程序的
-
使用注解:@注解名称
-
作用分类:
-
编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
/**+回车
把类复制一份,新建一个文件夹,粘贴,为了方便抽取,把包删去,打开命令行,用javadoc命令
抽取出来的信息,然后打开index.html
有乱码是编码没有统一 -
代码分析:通过代码里表示的注解对代码进行分析【使用反射】
-
编译检查:通过代码里表示的注解让编译器能够实现基本的编译检查【Override】
学习
- JDK预定义的一些注解
*@Override:检测被该注解标注的方法是否继承自父类(接口)的
*@Deprecated:将该注解标注的内容,表示已过时
*@SuppressWarnings:压制警告
一般传递参数all @SuppressWarnings("all")*
-
自定义注解
-
先看一下Deprecated的源码
格式:
*元注解:
public @interface 注解名称{}
模仿着写一下,定义一个自己的注解
此时可以使用它
那这玩意到底是什么意思呢!通过反编译进行操作。它最终会被编译成字节码文件,就反编译看一下是什么。在文件夹中新建一个文件。起名为MyAnno.java把模仿注解代码粘贴进来,用命令行先编译一下,再反编译(javap MyAnno.class)。
*本质:
注解本质上就是一个接口,该接口默认继承Annotation接口。
*属性:接口中可以定义的抽象方法
1.要求:属性的返回值类型
1)基本数据类型
2)String
3)枚举
4)注解
5)以上类型的数组
2.定义了的属性,在使用时需要赋值。
1)也可以在定义的时候后面添加default“”,设置默认值,不赋值时就是默认值。
2)如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。比如SuppressWarnings()。
3)数组赋值时,使用{}进行包裹。如果数组中只有一个值,则{}可以省略。
*元注解:用于描述注解的注解
*@Target:描述注解能够作用的位置
*@Retention:描述注解被保留的阶段
*@Documented:描述注解是否被抽取到api文档中
*@Inherited:描述注解是否被子类继承
先看下Target的源码
就一个属性,是value。类型是ElementType,再看下ElementType
需要知道前三个取值。
ElementType取值:
*TYPE:可以作用于类上
*METHOD:可以作用于方法上
*FIELD:可以作用于成员变量上
@Retention
里面的value也是枚举类型
@Retention:描述注解被保留的阶段
*@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到字节码文件中,并被JVM读取到。(最常用)如果是CLASS,则不会被JVM读取到,如果是SOURCE,则注解不会存在于字节码文件这个i不过。
- 在程序中使用(解析)注解:获取注解中获取的属性值
注解大多是用来替换配置文件的。老案例
以前用配置文件
现在用注解,定义一个注解,描述需要执行的类名和方法名
通过选中这一行代码,就会把这个类对应的对象创建,并且返回
接着补全
然后可以拿到注解中定义的属性值。剩下的代码就和配置文件中使用的代码一模一样。