https://juejin.cn/post/6978553765154521096
注解(元数据):与类,接口,枚举是在同一个层次,可声明在包,类,字段,方 法,局部变量,方法参数等的前面,用来对这些元素进行说明,注释。【1.5之后 新特性】
使用注解:@注解名称
作用分类:
编写文档:通过代码里标识的注解(元数据)生成文档【生成doc(api)文档】
Javadoc 类名.Java------->index.html
代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
编译检查:让编译器能够实现基本的编译检查【Override】
JDK中定义的一些注解:
@Override :检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings:压制警告
自定义注解
格式:
元注解
public @interface注解名称{
属性列表;//成员方法
}
本质:注解本质上就是一个接口, 该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
javac MyAnno.java javap MyAnno.class Compiled from "MyAnno.java" public interface MyAnno extends java.lang.annotation.Annotation { }
属性:接口中可以定义的成员方法 【抽象方法,public abstract可默认不写】
要求:
属性的返回值类型
1.基本数据类型
2.String
3.枚举
4.注解
5.以上类型的数组
比如写void 注解里面就不允许
2.定义了属性,在使用时需要给属性赋值
- 如果定义属性时,使用default关键字给属性默认初始化值,则使用属性时,不用赋值
- 如果只有一个属性需要赋值,且属性名称为value,则value可以省略 如果不止一个 就要手动指定value了
- 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略
public @interface Anno1 { String name() default "张三"; Anno2 myanno(); int[] age(); public abstract Student sss1(); } package edu.xupt.annotation; @Anno1(sss1 =Student.ss ,age = {15,22},name = "张三",myanno = @Anno2) public class Demon { }
元注解:用于描述注解的注解
@Target({ElementType.TYPE,ElementType.METHOD, ElementType.FIELD})
@Target:描述注解能够作用的位置
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
@Retention(RetentionPolicy.RUNTIME)
@Retention:描述注解被保留的阶段【source,class,runtime】
* @Retention(RetentionPolicy.RUNTIME):注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
* @Retention(RetentionPolicy.CLASS):注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
* @Retention(RetentionPolicy.SOURCE):注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
@Documented:描述注解是否被抽取到api文档中
@Interited:描述注解是否被子类继承