@Inherited元注解的使用
@Inherited注解标记其他的注解用于指明标记的注解是可以被自动继承的。
注意:此注解只对注解标记的超类有效,对接口是无效的。
示例:
先声明两个用@Inherited标记的注解,@Name和@Abbreviation,一个没有用@Inherited标记的注解@UpperCaseName
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.*; /**
* @author 春晨
* @date 2019/1/14 15:49
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Name {
//名称
String value();
}
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.*; /**
* @author 春晨
* @date 2019/1/14 14:59
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Abbreviation {
//简称
String value();
}
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.*; /**
* @author 春晨
* @date 2019/1/14 11:19
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface UpperCaseName {
//大写英文名称
String value();
}
接下来,我们声明一些接口和类用于举例,这些类的继承关系如下:

package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 15:57
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@UpperCaseName("ORGANISM")
@Abbreviation("Ogm")
@Name("Organism")
public interface Organism {
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 15:24
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
public interface Plant extends Organism{
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 15:30
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@UpperCaseName("FLOWER")
@Abbreviation("Flr")
@Name("Flower")
public abstract class Flower implements Plant {
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 16:00
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
public class Rose extends Flower {
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 11:25
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@UpperCaseName("ANIMAL")
@Abbreviation("Ani")
@Name("Animal")
public interface Animal extends Organism{
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 11:30
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
public abstract class Mammal implements Animal {
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 11:34
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@UpperCaseName("MONKEY")
@Abbreviation("Mky")
@Name("Monkey")
public class Monkey extends Mammal{
}
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* @date 2019/1/14 16:26
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
@Name("Roxellanae")
public class Roxellanae extends Monkey {
}
以下我们创建一个测试类:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.Annotation; /**
* @author 春晨
* @date 2019/1/14 11:39
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10268727.html
*/
public class InheritedAnnotation { public static void main(String[] args){ Annotation[] annotations = Plant.class.getAnnotations();
System.out.print("Plant接口继承Organism接口,在Organism接口上标记的注解,Plant获取不到:");
for (Annotation annotation : annotations){
System.out.print(annotation.toString()+" ");
}
annotations = Mammal.class.getAnnotations();
System.out.print("\nMamanl抽象类实现Animal接口,在Animal接口上标记的注解,Mammal获取不到:");
for (Annotation annotation : annotations){
System.out.print(annotation.toString()+" ");
}
annotations = Rose.class.getAnnotations();
System.out.print("\nRose类继承Flower抽象类,在Flower抽象类上标记的注解,如果注解是被@Inherited标记的,都可以获取到:");
for (Annotation annotation : annotations){
System.out.print(annotation.toString()+" ");
}
annotations = Roxellanae.class.getAnnotations();
System.out.print("\nRoxellanae类继承Monkey类,在Monkey抽象类上标记的注解,如果注解是被@Inherited标记的,都可以获取到;如果被@Inherited标记的注解父类和子类重复标记,则返回子类的注解:");
for (Annotation annotation : annotations){
System.out.print(annotation.toString()+" ");
}
}
}
输出结果:
Plant接口继承Organism接口,在Organism接口上标记的注解,Plant获取不到:
Mamanl抽象类实现Animal接口,在Animal接口上标记的注解,Mammal获取不到:
Rose类继承Flower抽象类,在Flower抽象类上标记的注解,如果注解是被@Inherited标记的,都可以获取到:@org.springmorning.demo.javabase.annotation.meta.Abbreviation(value=Flr) @org.springmorning.demo.javabase.annotation.meta.Name(value=Flower)
Roxellanae类继承Monkey类,在Monkey抽象类上标记的注解,如果注解是被@Inherited标记的,都可以获取到;如果被@Inherited标记的注解父类和子类重复标记,则返回子类的注解:@org.springmorning.demo.javabase.annotation.meta.Abbreviation(value=Mky) @org.springmorning.demo.javabase.annotation.meta.Name(value=Roxellanae)
通过运行结果我们可以得出如下三点结论:
- 没有被@Inherited注解标记的注解,例如上例中的@UpperCaseName注解,就不具有继承特性,在子类中获取不到父类的注解;
- @Inherited注解继承概念跟我们理解的面向对象继承概念不一样,它只作用于子类与父类之间的继承,像上例的Rose类就从Flower父类中继承了@Abbreviation和@Name注解;对于接口之间的继承和类与接口之间的实现,这两种继承关系不起作用,像上例中Plant接口继承Organism接口、Mamanl类实现Animal接口,就没能继承@Abbreviation和@Name注解;
- @Inherited注解标记的注解,在使用时,如果父类和子类都使用的注解是同一个,那么子类的注解会覆盖父类的注解,如上例中Roxellanae类用@Name注解标记了,Monkey类也用@Name注解标记了,那么Roxellanae类注解,会覆盖Monkey的@Name注解。
下节继续
下节将给大家讲解元注解@Repeatable的使用
@Inherited元注解的使用的更多相关文章
- Java元注解—— @Retention @Target @Document @Inherited
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...
- Java 元注解
元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...
- Java元注解
元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...
- [读书笔记] 二、条件注解@Conditional,组合注解,元注解
一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...
- 自定义注解,andjdk提供的元注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitN ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- 【Java编程思想笔记】注解--元注解
参考文章:(小白的小小白的白 )https://blog.csdn.net/weixin_42315600/article/details/80630669 https://www.cnblogs.c ...
- Spring注解与Java元注解小结
注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高 ...
- java注解中的元注解
一:java注解中的元注解 四个元注解分别是:@Target,@Retention,@Documented,@Inherited , 再次强调下元注解是java API提供,是专门用来定义注解的注解, ...
- java中元注解
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy ...
随机推荐
- 使用msf生成shellcode并用Go免杀?
msf生成的裸马现在已经不行了,加壳也只能加冷门壳了,VMP,Shielden,upx不是失效就是效果很差,所以当下,得用shellcode来免杀了 msfvenom -a x86 --platfor ...
- 我没能实现始终在一个线程上运行 task
前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项.但是我们最终没有提到如何在处理对于带有异步代码的办法.本篇将接受笔者对于该内容的总结. 如何识别当前代码跑在什么线程上 一切开始之前,我们先 ...
- kubernetes(k8s)命名空间一直Terminating
root@hello:~# kubectl get ns NAME STATUS AGE auth Terminating 34m default Active 23h kube-node-lease ...
- [ElasticSearch]修改开源安全组件Search Guard-6 用户密码
ES有很多的安全组件可用,例如: X-pack,Sarch Guard.但目前开源免费的,仅Search Guard. 1 前置条件 Elastic Search 6 服务安装成功,且成功运行. ES ...
- 进程,Process模块,join方法,ipc机制,守护进程
多道技术: """ 在学习并发编程的过程中 不做刻意提醒的情况下 默认一台计算机就一个CPU(只有一个干活的人) """ 单道技术 所有的程 ...
- day20:正则表达式
单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) \d 匹配数字 \D 匹配非数字 \w 匹配数字字母下划线 \W 匹配非数字或字母或下 ...
- Docker中Nginx搭建以及配置
docker nginx搭建 1 docker pull nginx docker pull nginx 2 启动nginx docker run --name nginx -p 80:80 -d n ...
- 万字长文,带你彻底搞懂 HTTPS(文末附实战)
大家好,我是满天星,欢迎来到我的技术角落,本期我将带你一起来了解 HTTPS. 前言 其实网上写 HTTPS 的文章也不少了,但是不少文章都是从原理上泛泛而谈,只讲概念,没有讲原因,作为小白,看完还是 ...
- Go语言网络编程:SSH连接
旨在提升Go语言网络编程能力 SSH是什么? SSH 为 Secure Shell 的缩写,为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SS ...
- 快速上手Linux核心命令(一):核心命令简介
前言 众所周知,Linux在服务器中占用不可替代的位置.大多数互联网公司,服务器都是采用的Linux操作系统.而Linux是一个主要通过命令行来进行管理的操作系统.只有熟练掌握Linux核心命令,在使 ...