@Inherited元注解的用法

死牛胖子
• 阅读 515

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
    String value() default "";
}

@Value("1")
public class Base {}

public class Child extends Base {
    public static void main(String[] args) throws Exception {
        Annotation[] annotations = Child.class.getAnnotations();
        Arrays.stream(annotations).forEach(System.out::println);
    }
}
// 输出为空

继承

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Value {
    String value() default "";
}

@Value("1")
public class Base {}

public class Child extends Base {
    public static void main(String[] args) throws Exception {
        Annotation[] annotations = Child.class.getAnnotations();
        Arrays.stream(annotations).forEach(System.out::println);
    }
}
// 输出:@Value(value=1)

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

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

@Value("1")
public interface IBase {}

public class Child implements IBase {
    public static void main(String[] args) throws Exception {
        Annotation[] annotations = Child.class.getAnnotations();
        Arrays.stream(annotations).forEach(System.out::println);
    }
}
// 输出为空

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

重写

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

@Value("1")
public class Base {}

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
JAVA注解
一、初步认识注解1.为什么学习注解?答: a.能够读懂别人写的代码,特别是框架相关的代码        b.让编程更加简洁,代码更加清晰2.注解概念?答:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法二、java中的常见注解1.JDK自带注解:        a、@Override
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Easter79 Easter79
3年前
SpringBoot自定义注解
JDK1.5起开始提供了4个元注解:@Target、@Retention、@Documented、@Inherited。何谓元注解?就是注解的注解。@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@
Stella981 Stella981
3年前
JPA、Hibernate、Spring data jpa之间的关系,终于明白了
什么么是JPA?全称JavaPersistenceAPI,可以通过注解或者XML描述【对象关系表】之间的映射关系,并将实体对象持久化到数据库中。为我们提供了:1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;如:@Entity、@Table、@C
Stella981 Stella981
3年前
SpringBoot自定义注解
JDK1.5起开始提供了4个元注解:@Target、@Retention、@Documented、@Inherited。何谓元注解?就是注解的注解。@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@
Wesley13 Wesley13
3年前
0、Spring 注解驱动开发
0、Spring注解驱动开发0.1简介《Spring注解驱动开发》是一套帮助我们深入了解Spring原理机制的教程;现今SpringBoot、SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解、原理,比如@Conditional、@Import、@
Wesley13 Wesley13
3年前
Java元注解
1、注解数据类型注解是写在.java文件中,使用@interface作为关键字,所以注解也是Java的一种数据类型,从广泛的定义来说,Class、Interface、Enum、Annotation都属于Class类型。2、元注解在创建注解的时候,需要使用一些注解来描述自己创建的注解(即注解的注解),就是写在@interfac
Easter79 Easter79
3年前
Spring注解@Resource和@Autowired区别对比、spring扫描的默认bean的Id、程序获取spring容器对象
\注解扫面的bean的ID问题0.前提需要明白注解扫描出来的bean的id默认是类名首字母小写,当然可以指定id:
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
死牛胖子 死牛胖子
5个月前
@Repeatable元注解的用法
Java注解@Repeatable元注解的用法
死牛胖子
死牛胖子
Lv1
悲歌可以当泣,远望可以当归。
文章
7
粉丝
1
获赞
0