@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 ...
随机推荐
- Kubernetes(K8S)内核优化常用参数详解
net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=10 net ...
- python之算术运算符复习
运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符 ...
- 多态、抽象、Object类
1.方法重写要求:方法名相同.参数类型相同.返回值相同或其子类返回值相同,子类修饰符要不小于父类 2.方法重载要求:方法名相同.参数类型不同.返回值没有改变.修饰符无关 3.多态的前提是继承.多态是定 ...
- 从桌面和应用内 Activity的启动流程
1.APP还没有被打开过从桌面启动 <1>首先桌面进程会像AMS服务发送startActivity的请求,AMS从system_service中去拿----一次IPC通信 <2> ...
- NTP 4.2.6p5版本导致多个系统安全漏洞
问题描述:通过漏洞扫描发现NTP 4.2.6p5版本导致多个系统漏洞,需要升级版本更高的ntp,一般刚开始都是yum直接装ntp包,现在需要重新卸载安装源码包 下载链接:http://distfile ...
- 通过 iframe 调用 天气预报&jsonp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【SSM项目】尚筹网(五)项目改写:使用前后端分离的SpringSecurityJWT认证
在项目中加入SpringSecurity 1 加入依赖 <!-- SpringSecurity --> <dependency> <groupId>org.spri ...
- Android事件分发-基础原理和场景分析
作者:京东零售 郭旭锋 1 为什么需要事件分发 和其他平台类似,Android 中 View 的布局是一个树形结构,各个 ViewGroup 和 View 是按树形结构嵌套布局的,从而会出现用户触摸的 ...
- ROS用hector创建地图
ROS用hector创建地图 连接小车 ssh clbrobot@clbrobot 激活树莓派 roslaunch clbrobot bringup.launch 打开hector_slam 重新开终 ...
- 高性能、快响应!火山引擎 ByteHouse 物化视图功能及入门介绍
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 物化视图是指将视图的计算结果存储在数据库中的一种技术.当用户执行查询时,数据库会直接从已经预计算好的结果中获取数据 ...