Annotation概述
从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。
- Annotation其实就是代码里的特殊标记,这些标记可以再编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
- Annotation可以像修饰符一样被使用,可用于修饰包、类、构造方法、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name=value”对中;
- Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据
常用Annotation
三个基本的Annotation:
- @Override:限定重写父类方法,该注解只能用于方法
- @Deprecated:用于表示某个程序元素(类、方法等)已过时
- @SuppressWarnings:抑制编译器警告
自定义Annotation
- 定义新的Annotation类型使用@interface关键字
- Annotation的成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员变量的名字和类型,且该方法是默认public和abstract的
- 可以在定义Annotation的成员变量时为其指定初始值,并用default关键字
- 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
/**
* 1.使用@interface定义注解
* 2.使用类似于接口方法声明的方式来定义注解的属性:其中返回值称为属性的类型,方法名为属性的名称
*/
public @interface HelloAnnotation{
public abstract String name() default "abc";
}
Tips:
- 1、如果只有一个属性名为value的属性需要设置,则可以直接设置。value的类型可以为任意,String和int都行。比如Target的value类型为ElementType[]。
- 2、如果数组属性中只有一个元素,这时候属性值部分可以省略大括号
String[] sdfs() default "sfs";
@HelloAnnotation(sdfs="sdf",value=5)
- 3、注解的属性值,也可以是注解。
- 4、属性值的类型,可以是基础类型,String,Class,注解,枚举,以及这几种类型的数组。
JDK的元Annotation
@Retention
@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间。包含一个RetentionPolicy类型的成员变量,该成员变量为Enum类型,包含下面三个值:
- RetentionPolicy.SOURCE:
- RetentionPolicy.CLASS
- RetentionPolicy.RUNTIME
分别对应:java源文件—class文件—内存中的字节码
@Target
@Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Targer也包含一个名为value的成员变量,该成员变量为ElementType类型的数组。ElementType是一个Enum类:
- ElementType .TYPE
- ElementType .FIELD
- ElementType . METHOD
- ElementType . PARAMETER
- ElementType .CONSTRUCTOR
- ElementType . LOCAL_VARIABLE
- ElementType . ANNOTATION_TYPE
- ElementType .PACKAGE
@Documented
@Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档
@Inherited
@Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解
对应用了注解的类进行反射操作
if(MainActivity.class.isAnnotationPresent(Deprecated.class)){
Deprecated deprecated=(Deprecated)MainActivity.class.getAnnotation(Deprecated.class);
}
interface AnnotatedElement 有四个方法:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Annotation[] getAnnotations();
Annotation[] getDeclaredAnnotations();
boolean isAnnotationPresent(Class<? extends Annotation> annotationType);
43. java视频教程Java基础注解-原创视频-爱奇艺
34_Java基础加强_注解的定义与反射调用-教育视频-爱奇艺
35_Java基础加强_为注解增加各种属性-教育视频-爱奇艺
公共技术点之 Java 注解 Annotation 注解指能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序 @codeKK 开源项目源码分析站
深入浅出Java注解 - 张明云的知识共享 - 知乎专栏
https://zhuanlan.zhihu.com/p/21410338?f3fb8ead20=ab6494355b08c31498a9660fe2f66b1e
深入理解Java注解(2):高级应用 - Jack Zhou的专栏 - 博客频道 - youkuaiyun.com
http://blog.youkuaiyun.com/zhoudaxia/article/details/33731583