[java]反射机制(Reflection)几种获取方法详解(下)-----注解的六种获取方法

首先要提出几个注解的注意点:

  • 只有定义了@Retention(value=RUNTIME)的Annotation才能在程序运行时被反射机制取得.
  • 定义里@Inherited的注解才能被继承
  • 同一个类/属性/方法上可以有任意个注解
  • 父类的注解能不能被子类继承呢?比较复杂,结论如下:
    [java]反射机制(Reflection)几种获取方法详解(下)-----注解的六种获取方法_第1张图片
    赵磊老师的技术博客做了比较细致的实验和讲解,链接:https://elf8848.iteye.com/blog/1621392

接下来先给出注解的六种获取方法:

  • getDeclaredAnnotations() 用于获取对象上的所有注解(不包括继承)
  • getDeclaredAnnotation(Class annotationClass) 用于获取对象上的指定注解(包括继承)
  • getAnnotations() 获取对象上的所有注解(包括继承)
  • getAnnotation(Class annotationClass) 获取对象上的指定注解(包括继承)
  • getDeclaredAnnotationsByType(Class annotationClass) 获取与指定注解相关联的所有注解(包括继承)
  • getAnnotationsByType(Class annotationClass) 获取与指定注解相关联的所有注解(包括继承)

所有的Class/Field/Method对象都可以调用上述方法
大家注意到了,注解的获取方法也可以根据有没有Declared分为两批.
与之前的获取方法类似,有Declared的方法意味着不能获取继承的注解,而没有Declared的方法则可以获取继承的注解.

getDeclaredAnnotations() 可以返回一个包含所有Annotation对象的一维数组.

getDeclaredAnnotation(Class annotationClass) 的用法为:
对象.getDeclaredAnnotation(注解名.class)
可以返回一个Annotation的注解对象

getAnnotations() 和 getAnnotation(Class annotationClass) 两个方法的用法和上述相同.

下面的两个个获取注解的方法不常用,这里简单的介绍一下它们的作用:

getDeclaredAnnotationsByType(Class annotationClass) 和 getAnnotationsByType(Class annotationClass) 都是用于返回对象上与指定注解相关联的Annotation对象一维数组,
区别在于带Declared不包含继承的注解,不带Declared包含继承的注解.

你可能感兴趣的:(java基础)