注解 @Override 的定义

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.SOURCE)
  3. public @interface Override {
  4. }

它本质上就是

  1. public interface Override extends Annotation{
  2. }

而解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。编译器的扫描指的是编译器在对 java 代码编译字节码的过程中会检测到某个类或者方法被一些注解修饰,这时它就会对于这些注解进行某些处理。

元注解

元注解是用于修饰注解的注解,通常用在注解的定义上,例如:

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.SOURCE)
  • @Target:注解的作用目标(类,方法)
  • @Retention:注解的生命周期
  • @Documented:注解是否应当被包含在 JavaDoc 文档中
  • @Inherited:是否允许子类继承该注解

ElementType的枚举值:

  • ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
  • ElementType.FIELD:允许作用在属性字段上
  • ElementType.METHOD:允许作用在方法上
  • ElementType.PARAMETER:允许作用在方法参数上
  • ElementType.CONSTRUCTOR:允许作用在构造器上
  • ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
  • ElementType.ANNOTATION_TYPE:允许作用在注解上
  • ElementType.PACKAGE:允许作用在包上

RetentionPolicy的枚举值:

  • RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
  • RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
  • RetentionPolicy.RUNTIME:永久保存,可以反射获取

自定义注解

  1. public @interface InnotationName{
  2. }

反射和注解

  • getAnnotation:返回指定的注解
  • isAnnotationPresent:判定当前元素是否被指定注解修饰
  • getAnnotations:返回所有的注解
  • getDeclaredAnnotation:返回本元素的指定注解
  • getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的
  1. class AnnotationInvocationHandler implements InvocationHandler, Serializable {
  2. private static final long serialVersionUID = 6182022883658399397L;
  3. private final Class<? extends Annotation> type;
  4. private final Map<String, Object> memberValues;
  5. private transient volatile Method[] memberMethods = null;
  6. AnnotationInvocationHandler(Class<? extends Annotation> var1, Map<String, Object> var2) {
  7. Class[] var3 = var1.getInterfaces();
  8. if (var1.isAnnotation() && var3.length == 1 && var3[0] == Annotation.class) {
  9. this.type = var1;
  10. this.memberValues = var2;
  11. } else {
  12. throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type.");
  13. }
  14. }