ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 元注解 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解。 ### @Retention Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。 它的取值如下:  * RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。  * RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。  * RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它 ### @Target Target 是目标的意思,@Target 指定了注解运用的地方。 @Target 有下面的取值 * ElementType.ANNOTATION\_TYPE 可以给一个注解进行注解 * ElementType.CONSTRUCTOR 可以给构造方法进行注解 * ElementType.FIELD 可以给属性进行注解 * ElementType.LOCAL\_VARIABLE 可以给局部变量进行注解 * ElementType.METHOD 可以给方法进行注解 * ElementType.PACKAGE 可以给一个包进行注解 * ElementType.PARAMETER 可以给一个方法内的参数进行注解 * ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举 ### @Inherited Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。 ### @Documented 顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。 ### @Repeatable Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。 什么样的注解会多次应用呢?通常是注解的值可以同时取多个。 ~~~ @Person(role="artist") @Person(role="coder") @Person(role="PM") public class SuperMan{ } ~~~ ## Java 预置的注解 ### @Deprecated 这个元素是用来标记过时的元素 ### @Override 这个大家应该很熟悉了,提示子类要复写父类中被 @Override 修饰的方法 ## 运行期提取注解 java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。 AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息: ### getAnnotation T getAnnotation(Class annotationClass) 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。 ### isAnnotationPresent boolean isAnnotationPresent(Class annotationClass) 判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false. ### getAnnotations Annotation\[\] getAnnotations() 返回该程序元素上存在的所有注解。 ### getDeclaredAnnotations Annotation\[\] getDeclaredAnnotations() 返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。 ## 编译期提取注解 在其他文章再细说 ## 推荐阅读 [深入理解Java:注解(Annotation)--RUNTIME运行时注解的处理](https://blog.csdn.net/fei20121106/article/details/51353725) [Java注解深入浅出](https://blog.csdn.net/shengzhu1/article/details/81271409)