Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >子类可以继承到父类上的注解吗--有结论了

子类可以继承到父类上的注解吗--有结论了

作者头像
lyb-geek
发布于 2018-07-26 02:19:13
发布于 2018-07-26 02:19:13
2.9K00
代码可运行
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路
运行总次数:0
代码可运行

子类可以继承到父类上的注解吗?

-----------------------------------------------------------------

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。

测试环境如下:

-----------------------------------------------------------------

父类的类上和方法上有自定义的注解--MyAnnotation

子类继承了这个父类,分别:

子类方法,实现了父类上的抽象方法

子类方法,继承了父类上的方法

子类方法,覆盖了父类上的方法

MyAnnotation自定义注解

-----------------------------------------------------------------

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test.annotation;  
import java.lang.annotation.Inherited;  
import java.lang.annotation.Retention;  
/** 
 * 自定义注解 
 */  
//@Inherited  //可以被继承  
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)  //可以通过反射读取注解  
public @interface MyAnnotation {    
    String value();    
}

父类

-----------------------------------------------------------------

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test.annotation;  
@MyAnnotation(value = "类名上的注解")  
public abstract class ParentClass {  

    @MyAnnotation(value = "父类的abstractMethod方法")  
    public abstract void abstractMethod();  

    @MyAnnotation(value = "父类的doExtends方法")  
    public void doExtends() {  
        System.out.println(" ParentClass doExtends ...");  
    }  

    @MyAnnotation(value = "父类的doHandle方法")  
    public void doHandle(){  
        System.out.println(" ParentClass doHandle ...");  
    }  
}

子类

-----------------------------------------------------------------

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test.annotation;  
public class SubClass extends ParentClass{    

    //子类实现父类的抽象方法  
    @Override    
    public void abstractMethod() {    
        System.out.println("子类实现父类的abstractMethod抽象方法");    
    }    

    //子类继承父类的doExtends方法  

    //子类覆盖父类的doHandle方法  
    @Override    
    public void doHandle(){  
        System.out.println("子类覆盖父类的doHandle方法");   
    }  
}

测试类

-----------------------------------------------------------------

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test.annotation;  

import java.lang.reflect.Method;  

public class MainTest {  
    public static void main(String[] args) throws SecurityException,  
            NoSuchMethodException {  

        Class<SubClass> clazz = SubClass.class;  

        if (clazz.isAnnotationPresent(MyAnnotation.class)) {  
            MyAnnotation cla = clazz  
                    .getAnnotation(MyAnnotation.class);  
            System.out.println("子类继承到父类类上Annotation,其信息如下:"+cla.value());  
        } else {  
            System.out.println("子类没有继承到父类类上Annotation");  
        }  

        // 实现抽象方法测试  
        Method method = clazz.getMethod("abstractMethod", new Class[] {});  
        if (method.isAnnotationPresent(MyAnnotation.class)) {  
            MyAnnotation ma = method  
                    .getAnnotation(MyAnnotation.class);  
            System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:"+ma.value());  
        } else {  
            System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation");  
        }  

        //覆盖测试  
        Method methodOverride = clazz.getMethod("doExtends", new Class[] {});  
        if (methodOverride.isAnnotationPresent(MyAnnotation.class)) {  
            MyAnnotation ma = methodOverride  
                    .getAnnotation(MyAnnotation.class);  
            System.out  
                    .println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:"+ma.value());  
        } else {  
            System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation");  
        }  

        //继承测试  
        Method method3 = clazz.getMethod("doHandle", new Class[] {});  
        if (method3.isAnnotationPresent(MyAnnotation.class)) {  
            MyAnnotation ma = method3  
                    .getAnnotation(MyAnnotation.class);  
            System.out  
                    .println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:"+ma.value());  
        } else {  
            System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation");  
        }  
    }  
}

编写自定义注解时未写@Inherited的运行结果

-----------------------------------------------------------------

子类没有继承到父类类上Annotation

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

编写自定义注解时写了@Inherited的运行结果

-----------------------------------------------------------------

子类继承到父类类上Annotation,其信息如下:类名上的注解

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

结论

-----------------------------------------------------------------

父类的类上和方法上有自定义的注解,

子类继承了这个父类,的情况下。

编写自定义注解时未写@Inherited的运行结果:

编写自定义注解时写了@Inherited的运行结果:

子类的类上能否继承到父类的类上的注解?

子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?

子类方法,继承了父类上的方法,这个方法能否继承到注解?

子类方法,覆盖了父类上的方法,这个方法能否继承到注解?

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。

通过测试结果来看,@Inherited 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。

附注

-----------------------------------------------------------------

Spring 实现事务的注解@Transactional 是可以被继承的,

通过查看它的源码可以看到@Inherited。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java魔法堂:自定义和解析注解
一、前言                               注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作。 二、自定义注解                           只需通过 关键字@interface 即可自定义注解 // 标识注解(就是无属性的注解)
^_^肥仔John
2018/01/18
4840
夯实Java基础系列15:Java注解简介和最佳实践
Annotation 中文译过来就是注解、标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解。
Java技术江湖
2019/10/15
6140
​Java 注解详解
注解是在Java 1.5之后引入的,为的是可以直接在代码中编写元信息。在注解发布之前,如果想要描述代码只能将其写入到其他文件中,例如xml。 注解可以应用于包,类,方法,字段,参数,类型(Java 8之后)。注解并不会直接影响代码,它只是为第三方系统提供代码的元信息,第三方系统通过解析这些注解获取信息,从而执行不同的方法。
代码拾遗
2018/07/24
5440
java自定义注解
现在我们就有了一个自定义的注解 @MyAnnotation。但是现在这个注解还不能添加在任何地方,需要继续修改。
何白白
2019/06/28
1.1K0
基础篇:深入解析JAVA注解机制
在代码里定义的注解,会被jvm利用反射技术生成一个代理类,然后和被注释的代码(类,方法,属性等)关联起来
潜行前行
2020/12/11
6540
基础篇:深入解析JAVA注解机制
spring自定义注解实现(spring里面的注解)
1.SOURCE:在源文件中生效,仅存在java文件中,class文件将会去除注解。
全栈程序员站长
2022/07/30
7830
spring自定义注解实现(spring里面的注解)
Java 使用注解
在 Java 开发领域,注解(Annotation)是一项极为重要且强大的特性。它就像是给代码添加的特殊标记或标签,能够在不改变原有代码逻辑的基础上,为程序提供额外的元数据信息,从而实现诸如代码自动生成、运行时动态处理、配置简化等丰富功能,极大地提升了开发效率和代码的灵活性与可维护性。
编程小白狼
2024/12/31
810
你说啥什么?注解你还不会?
元注解就是注解自定义注解的注解。可能有点饶,一会看例子就明白了,直白点就是给你自定义的注解上一定要加的注解。
手撕代码八百里
2020/10/26
4560
你分析过注解 Annotation 的实现原理吗?
对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。
JavaFish
2019/10/17
6.9K0
JAVA注解
      http://blog.csdn.net/rj042/article/details/6399965
bear_fish
2018/09/20
1.4K0
JAVA注解
秒懂,Java 注解 (Annotation)你可以这样用
它们是Target、Retention、Documented和Inherited。
lyb-geek
2018/07/26
8730
秒懂,Java 注解 (Annotation)你可以这样用
java基础第十八篇之单元测试、注解和动态代理
1:单元测试 1)JUnit是一个Java语言的单元测试框架,这里的单元指的就是方法 2)单元测试用来替换以前的main方法
海仔
2019/08/05
4380
android注解
包 java.lang.annotation 中包含所有定义自定义注解所需用到的原注解和接口。 如接口 java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。 该包同时定义了四个元注解,Documented,Inherited,Target(作用范围,方法,属性,构造方法等),Retention(生命范围,源代码,class,runtime)。
提莫队长
2019/02/21
5290
19 浅析 Java 注解(Annotation)
Java 5之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),例如在方法覆盖中使用过的@Override注解,注解都是@符号开头的。
acc8226
2022/05/17
2180
19 浅析 Java 注解(Annotation)
【刨根问底】java注解--下
@Retention只能修饰注解定义,用于指定被修饰的注解可以保留多长时间,@Retention包含了一个RetentionPolicy类的value变量,所以使用此注解时必须为该value变量赋值。源码如下:
田维常
2019/07/16
2890
【刨根问底】java注解--下
Java 注解(Annotation)
从Java5.0版发布以来,5.0平台提供了一个正式的annoatation功能:允许开发者定义、使用自己的annotation类型。此功能由一个定义annotation声明的语法,读取annotation的API,一个使用annotation修饰的class文件,一个annotation处理工具(apt)组成。
全栈程序员站长
2022/09/08
4370
java 注解简述
注解(annotation)相当于一个运行于内存当中的自定义类型的数据存储区域,理解以后才发现它的好用,就是数据存储区,相当于一个运行在内存当中的XML,所有的注解数据在JDK加载完类以后,就可以被使用。
潇洒
2023/10/20
1850
java自定义注解和使用[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129174.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/29
2340
Java注解Annotation详解
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
java干货
2021/02/19
5950
女朋友说想要自己的注解,我又活下来了!!!
moon:看好了,我的宝~,你spring学的不错,那我先带你参观下Autowired吧~
moon聊技术
2021/08/20
5390
相关推荐
Java魔法堂:自定义和解析注解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文