注解
概念
注释:用文字描述,给程序员看的
注解概念:代码级别的说明(元数据),说明程序的,给计算机看的。
作用:
- 编译检查:
@Override:告诉计算机,这个方法是重写的父类的方法,如果父类中没有这个方法就会报错,所以注解在此起到了编译检查的作用。- 编写文档:生成java文档时,会抽取对应注解的内容
@author 标识用户
@version 标识版本
@since 标识时间
@param 标识参数- 代码分析:通过标识的注解,对代码进行分析和处理(我们常用)
JDK预定义注解
@Override 标注的犯法是否继承自父类/接口
@Deprecated 注释对内容过时,不建议使用
@SuppressWarnings 压制警告(多会加在类上)
自定义注解
1、格式
//元注解
public @interface 注解名称{
//属性列表:就是抽象方法列表
}
注解的本质就是一个接口,所有注解都继承Annotation父接口
//注解反编译得到的内容
public interface 注解名称 extends Annotation{
}
即然注解本质是一个接口,所以注解就可以定义常量(被static修饰的方法)和抽象方法(没有方法体的方法)
2、属性:注解中定义的抽象方法,返回值必须是以下几种类型
- 基本数据类型
- 字符串String
- 注解类型
- 枚举类型
- 以上类型的数组
3、使用
//定义注解
public @interface MyAnno{
String name();
int age() default 20;
//注解
MyAnno2 anno();
//枚举
PersonEnum person();
//数组
String[] arr();
}
public @interface MyAnno2{
}
public enum PersonEnum{
P1,P2;
}
//使用注解:直接给抽象方法名命名,多个方法名使用逗号分隔,有default的属性则可以不用付值,单个属性则可以直接赋值不用
public class User{
@MyAnno(name="aa",age=10,anno=@MyAnno2,person=PersonEnum.P1,arr={"a","b"})
public void method(){
}
}
- 定义的属性有default默认初始值,可以不赋值而自动使用默认值
- 如果只有一个属性,而且属性的名称是value,则可省略value直接赋值
- 数组赋值的时候,值使用{}包裹,如果数组中只有一个值,可以省略{}
元注解
什么是元注解:就是自定义注解上的注解
1、JDK提供的四个元注解
- @Target 当前注解可以作用(放在)的位置
ElementType.TYPE:作用在类上
ElementType.METHOD:作用在方法上
ElementType.FIELD:作用在成员变量上- @Retention:当前注解被保留的阶段
SOURCE<CLASS<RUNTIME
SOURCE:只在代码阶段有效
CLASS:保留到字节码阶段
RUNTIME:运行阶段有效- @Documented:注解是否被抽取到doc的api文档中
- @inherited:使用该注解的类的子类也会有该注解
2、自定义注解