-
从JDK 5.0 开始,Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解)
-
Annotation其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息.
-
Annotation可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量,的声明, 这些信息被保存在Annotation 的 “name=value”对中.
-
Annotation能被用来为程序元素(类, 方法, 成员变量等) 设置元数据
(元注解:注解的注解)
基本的 Annotation:
-
使用Annotation 时要在其前面增加 @ 符号, 并把该Annotation 当成一个修饰符使用. 用于修饰它支持的程序元素
-
三个基本的Annotation:
-
@Override: 限定重写父类方法, 该注释只能用于方法
-
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时
-
@SuppressWarnings: 抑制编译器警告.
-
自定义 Annotation:
-
定义新的Annotation 类型使用 @interface 关键字
-
Annotation的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型.
-
可以在定义Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用default 关键字
-
没有成员定义的Annotation 称为标记; 包含成员变量的Annotation 称为元数据 Annotation
创建一个MyAnnotation1:
public @interface MyAnnotation1 {
String phone();
}
创建一个Student类:
public enum Student {
xiaohong,xiaohei,xiaolv;
}
创建一个MyAnnotation2:
public @interface MyAnnotation2 {
String sex();
int age();
double[] score();
Student stu();
MyAnnotation1 myAnno();
}
调用:
@MyAnnotation2(sex = "男",age=18,score = {66,58,70},stu = Student.xiaohei,myAnno = @MyAnnotation1(phone = "18632594685"))
public class Demo1 {
}
常用注解:
1.@Target
:注解的作用目标
@Target(ElementType.TYPE)
——接口、类、枚举、注解 @Target(ElementType.FIELD)
——字段、枚举的常量 @Target(ElementType.METHOD)
——方法 @Target(ElementType.PARAMETER)
——方法参数 @Target(ElementType.CONSTRUCTOR)
——构造函数 @Target(ElementType.LOCAL_VARIABLE)
——局部变量 @Target(ElementType.ANNOTATION_TYPE)
——注解 @Target(ElementType.PACKAGE)
——包
2.@Retention
:注解的保留位置
RetentionPolicy.SOURCE
:这种类型的Annotations
只在源代码级别保留,编译时就会被忽略,在class
字节码文件中不包含。 RetentionPolicy.CLASS
:这种类型的Annotations
编译时被保留,默认的保留策略,在class
文件中存在,但JVM
将会忽略,运行时无法获得。 RetentionPolicy.RUNTIME
:这种类型的Annotations
将被JVM
保留,所以他们能在运行时被JVM
或其他使用反射机制的代码所读取和使用。
(这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码,且生命周期长度 SOURCE < CLASS < RUNTIME)
3.@Document
:说明该注解将被包含在javadoc
中4.@Inherited
:说明子类可以继承父类中的该注解
心得总结: