@Inherited元注解的用法

Java 的类本身具备继承的能力,可以继承一个类,也可以实现多个接口。那么产生了一个疑问:在父类或者接口上标记的注解,在解析子类时是否可以解析得到?从而使用子类在继承父类的时候,同时继承注解标记所拥有的能力。

1@Target({ElementType.TYPE, ElementType.METHOD}) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface Value { 4 String value() default ""; 5} 6 7@Value("1") 8public class Base {} 9 10public class Child extends Base { 11 public static void main(String[] args) throws Exception { 12 Annotation[] annotations = Child.class.getAnnotations(); 13 Arrays.stream(annotations).forEach(System.out::println); 14 } 15} 16// 输出为空

继承

通过上面的代码可以看出,通过子类是无法直接解析出父类上标记的注解的。JDK 提供了 @Inherited 元注解,只要在注解上添加这个元注解,就可以实现通过子类解析出父类上标记的注解。

1@Target({ElementType.TYPE, ElementType.METHOD}) 2@Retention(RetentionPolicy.RUNTIME) 3@Inherited 4public @interface Value { 5 String value() default ""; 6} 7 8@Value("1") 9public class Base {} 10 11public class Child extends Base { 12 public static void main(String[] args) throws Exception { 13 Annotation[] annotations = Child.class.getAnnotations(); 14 Arrays.stream(annotations).forEach(System.out::println); 15 } 16} 17// 输出:@Value(value=1)

通过上面的代码可以看到,仅仅是加了一行 @Inherited,父类上的注解就可以被子类直接解析得到。

同样的代码,我们使用接口再运行一次

1@Value("1") 2public interface IBase {} 3 4public class Child implements IBase { 5 public static void main(String[] args) throws Exception { 6 Annotation[] annotations = Child.class.getAnnotations(); 7 Arrays.stream(annotations).forEach(System.out::println); 8 } 9} 10// 输出为空

通过上面的代码可以看到,标记的接口上注解解析不了。其实不光接口上的注解无法继承,成员变量、方法等其它元素都无法继承,也就是说,所谓继承,只能继承 class 上的注解,其它都无法继承。

重写

子类可以继承父类上的注解,子类本身也可以标记注解。如果子类与父类同时标记的同一个注解,会产生怎么样的结果呢?

1@Value("1") 2public class Base {} 3 4@Value("3") 5public class Child extends Base { 6 public static void main(String[] args) throws Exception { 7 Annotation[] annotations = Child.class.getAnnotations(); 8 Arrays.stream(annotations).forEach(System.out::println); 9 } 10} 11// 输出 @Anno1(value=3)

通过上面的代码可以看出,子类与父类标记相同的注解,子类会覆盖父类。 这与子类实现父类中的方法是一样的效果。

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

JAVA注解

一、初步认识注解1.为什么学习注解?答: a.能够读懂别人写的代码,特别是框架相关的代码        b.让编程更加简洁,代码更加清晰2.注解概念?答:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法二、java中的常见注解1.JDK自带注解:        a、@Override

thinkphp3.2.3模板渲染支持三元表达式

thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa

SpringBoot自定义注解

JDK1.5起开始提供了4个元注解:@Target、@Retention、@Documented、@Inherited。何谓元注解?就是注解的注解。@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA?全称JavaPersistenceAPI,可以通过注解或者XML描述【对象关系表】之间的映射关系,并将实体对象持久化到数据库中。为我们提供了:1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;如:@Entity、@Table、@C