概述
JDK中获取注解时,返回的都是Annotation类型,如下(截取自JDK源码)
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
当获取到Annotation的实例后,可以通过getClass(从Object继承而来)和annotationType(Annotation接口中的方法)获取到相关的Class。下面阐述一下两者的区别,以下内容为自己的推断,并不是通过翻阅源码获得的结论。
getClass与annotationType对比
测试代码:
SpringBootApplication a = DemoApplication.class.getAnnotation(SpringBootApplication.class);
Class<? extends Annotation> b = a.annotationType();
Class<?> c = a.getClass();
ComponentScan d = b.getAnnotation(ComponentScan.class);
ComponentScan e = c.getAnnotation(ComponentScan.class);
测试结果:
从图中可以看出:
- getClass获取到的是一个代理类对象,通过该对象,通过该对象可以获取到注解中定义的属性。
- annotationType获取到的是注解本身(Class对象),通过该接口可以实现获取注解上的注解,比如:上面通过annotationType可以获取到SpringBootApplication 注解上的ComponentScan注解信息
推论
- 注解是一类特殊的接口,其定义了注解实例对象(通过getAnnotation获取的类上面的注解信息)能够拥有的属性,它本身也有Class属性。
- getAnnotation方法获取到的注解实例有自己的类型,它是JDK利用代理技术实现了注解(注解是一类特殊的接口)的实现类,并不是注解类型本身
上面说的有点绕,如果把注解当做接口来看,那么就会有接口、实现类、实现类的对象;分别对应上述代码中的
- a.annotationType()
- Class<?> c = a.getClass();
- SpringBootApplication a = DemoApplication.class.getAnnotation(SpringBootApplication.class);