

JAVA中的注解可以继承吗? - JAVA旭阳
source link: https://www.cnblogs.com/alvinscript/p/16979274.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

注解想必大家都用过,也叫元数据,是一种代码级别的注释,可以对类或者方法等元素做标记说明,比如Spring框架中的@Service
,@Component
等。那么今天我想问大家的是类被继承了,注解能否继承呢?可能会和大家想的不一样,感兴趣的可以往下看。
简单注解继承演示
我们不妨来验证下注解的继承。
- 自定义一个注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
String value();
}
- 注解可以被标记在类或者方法上
- 使用自定义注解
@TestAnnotation(value = "Class")
static class Parent {
@TestAnnotation(value = "Method")
public void method() {
}
}
static class Child extends Parent {
@Override
public void method() {
}
}
Parent
类和里面的方法使用了注解Child
类继承了Parent类, 重写了父类的方法
- 验证是否存在注解
public static void main(String[] args) throws NoSuchMethodException {
Parent parent = new Parent();
log.info("ParentClass: {}", getAnnoValue(parent.getClass().getAnnotation(TestAnnotation.class)));
log.info("ParentMethod: {}", getAnnoValue(parent.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));
Child child = new Child();
log.info("ChildClass: {}", getAnnoValue(child.getClass().getAnnotation(TestAnnotation.class)));
log.info("ChildMethod: {}", getAnnoValue(child.getClass().getMethod("method").getAnnotation(TestAnnotation.class)));
}
private static String getAnnoValue(TestAnnotation annotation) {
if(annotation == null) {
return "未找到注解";
}
return annotation.value();
}
输出结果如下:
可以看到,父类的类和方法上的注解都可以正确获得,但是子类的类和方法却不能。这说明,默认情况下,子类以及子类的方法,无法自动继承父类和父类方法上的注解。
使用@Inherited演示
查了网上资料以后,在注解上标记@Inherited
元注解可以实现注解的继承。那么,把@TestAnnotation
注解标记了@Inherited,就可以一键解决问题了吗?
重新运行,得到结果如下:
可以看到,子类可以获得父类类上的注解;子类方法虽然是重写父类方法,并且注解本身也支持继承,但还是无法获得方法上的注解。
如何重写方法继承注解?
实际上,@Inherited
只能实现类上的注解继承。要想实现方法上注解的继承,你可以通过反射在继承链上找到方法上的注解。是不是听起来很麻烦,好在Spring框架中提供了AnnotatedElementUtils
类,来方便我们处理注解的继承问题。
调用AnnotatedElementUtils
的findMergedAnnotation()
方法,可以帮助我们找出父类和接口、父类方法和接口方法上的注解,实现一键找到继承链的注解:
输出结果如下图:
自定义注解可以通过标记元注解@Inherited
实现注解的继承,不过这只适用于类。如果要继承定义在接口或方法上的注解,可以使用Spring的工具类AnnotatedElementUtils
。
如果本文对你有帮助的话,请留下一个赞吧
欢迎关注个人公众号——JAVA旭阳
更多学习资料请移步:程序员成神之路
Recommend
-
4
本篇文章主要讲解下Map家族中3个相对冷门的容器,分别是WeakHashMap、EnumMap、IdentityHashMap, 想必大家在平时的工作中也很少用到,或者压根不知道他们的特性以及适用场景,本篇文章就带你一探究竟。 WeakHashMap WeakHashMap称...
-
8
大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。 实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么他们二者之间的性能是怎么样的呢? Random的使用 Rand...
-
4
在使用spring的过程中,我们有没有发现它的扩展能力很强呢? 由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今天我们主要来学习Spring中很常用的11个扩展点,你用过几个呢?
-
7
欢迎关注微信公众号「JAVA旭阳」交流和学习 IntelliJ目前已经成为市面上最受欢迎的Java开发工具,这得益于里面非常丰富的插件机制。本文我将分享在日常开发中我经常使用的5个插件,它们可以帮助您提高工作效率。...
-
8
丧心病狂,竟有Thread.sleep(0)这种神仙写法? 最...
-
9
作为一名java开发程序员,不知道大家有没有遇到过一些匪夷所思的bug。这些错误通常需要您几个小时才能解决。当你找到它们的时候,你可能会默默地骂自己是个傻瓜。是的,这些可笑的bug基本上都是你忽略了一些基础知识造成的。其实都是很低级的错误。今天,我总结一些...
-
6
微服务架构如今非常的流行,这个架构下可能经常会遇到“双写”的场景。双写是指您的应用程序需要在两个不同的系统中更改数据的情况,比如它需要将数据存储在数据库中并向消息队列发送事件。您需要保证这两个操作都会成功。如果两个操作之一失败,您的系统可能会变得不...
-
5
假如让你为淘宝这种数据量非常大的公司的设计一个可扩展的数据存储系统,你该如何存储和管理数据呢?总不能放在单个服务器上吧,肯定放不下,必然需要水平扩展。那么这样就带来一个问题,这个数据要存储在哪个服务器上呢?这就引入了本文的主题一致性哈希算法,可能...
-
5
你知道CDN是干嘛的吗? theme: cyanosis
-
11
作为内存中数据存储,Redis 以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案。 但是,在内部,Redis 采用单线程架构。 为什么单线程设计依然会有这么高的性能?如果利用多线程并发处理请求不是更好吗? 在本文中,让我们深入探讨...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK