如何根据“注解”获得被标注的“注解”?
如何根据“注解”获得被标注的“注解”?
举例:
先举个例子大家应该都知道Spring框架中的@Repository、@Service、@Controller这几个注解在源码中都被@Component注解所标注
问题:
- 在原生反射或者Spring框架中可以通过扫描@Component注解就能找到@Repository、@Service、@Controller所标注的类吗?
- 如果不能,那@Component注解为什么要标注在@Repository、@Service、@Controller注解中求解?
代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@interface Tags {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Tags
@interface RedTag{
}
@RedTag
class TagDemo{
public static void main(String[] args) {
Annotation[] annotations = TagDemo.class.getAnnotations();
System.out.println("Annotation[]: " +Arrays.toString(annotations));
// Annotation[]: [@pub.guoxin.demo.gateway.dr.prvd.RedTag()]
Tags annotation = TagDemo.class.getAnnotation(Tags.class);
System.out.println("Tags: " + annotation);
// Tags: null
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
所有注解本质上都是继承自
Annotation
的接口 (interface
)。假设
Foo
是Component
,Bar
是Service
,可以类比得到。要注意的是,通过反射拿到的注解实例实际上是代理类,毕竟前面说了注解编译后只是个接口,所以注解属性的取值操作都需要靠代理类来实现,所以不能直接在拿到的注解实例上去
getAnnotation
。