子类可以继承到父类上的注解吗
转载自 子类可以继承到父类上的注解吗?
不了解注解基础知识的请先看《JDK 5 Annotation\注解\注释\自定义注解》
子类可以继承到父类上的注解吗?
我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。
测试环境如下:
父类的类上和方法上有自定义的注解--MyAnnotation
子类继承了这个父类,分别:
子类方法,实现了父类上的抽象方法
子类方法,继承了父类上的方法
子类方法,覆盖了父类上的方法
MyAnnotation自定义注解
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();
}
父类
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 ..." ); }
}
子类
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方法" ); }
}
测试类
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。
子类可以继承到父类上的注解吗相关推荐
- 【BAT面试题典】子类可以继承到父类上的注解吗?
子类重写父类方法后,可以继承方法上的注解吗? 这个不急,让我来分析一下,假设有如下注解: 定义被注解的类 子类直接继承父类 获取父子类和方法的注解信息,并输出注解的value属性的值 日志输出 可见子 ...
- java中子类能否继承 重写父类的静态方法
文章目录 1.疑问 子类能否继承父类的静态变量和静态方法 子类能否重写父类的静态方法 2. 原因 1.疑问 子类能否继承父类的静态变量和静态方法 首先,子类是可以继承父类的静态变量和静态方法的. cl ...
- 类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)
题目如下 定义一个计算机类(Computer),并在它的基础上派生出两个子类:台上机(Desktop)和便携机类(Notebook),在Computer中定义几个方法,并在子类Desktop和Note ...
- java 子类继承父类_关于Java 的继承问题,子类会继承父类的哪些东西?-----转载...
和C++类似,可以继承基类的公共属性和方法. 在Java继承里,父类的属性还有方法在声明时,如果是public关键字即公共属性,则在子类继承时,这些属性和方法都会被子类继承.受保护的也可以继承 但是私 ...
- 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
转载自 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...
- java父类声明子类实现_java中父类声明子类实例化
问题: 1.比如两个类父类:Person 子类 Student extends Person在使用时候,这样写:Person person=null; //声明对象person=new Student ...
- C++继承中父类和子类之间的赋值兼容
文章目录 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 1.2 特殊的同名函数 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 在公有继承的条件下,子类对象可 ...
- java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗
一.简单总结,需要重写的有 普通类继承抽象类,重写所有抽象类方法:(不包括普通方法) 普通类继承接口,重写所有接口方法.(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写 ...
- 子类怎么继承父类方法中的变量_关于继承的那些事!
第二阶段 JAVA面向对象 第二章 继承 其实在我们面向对象这一阶段的学习中,我们就是围绕Java的三大特性(封装.继承.多态)来讲解的,在上一掌内容中我们讲解了一部分封装的有关知识,今天我们来重点学 ...
最新文章
- python演变_简说Python生态系统的14年演变
- 没想到,因为这场AI大会,我也可以凡尔赛一把
- burpsuite 简单介绍
- linux Centos下磁盘分区及文件系统创建与挂载
- vector的学习(系统的学习)
- python- 属性 静态方法,类方法
- mysql 、慢查询、到底如何玩
- 带SN切换流程_贴片电阻生产工艺流程简介
- 基于OPENCV的OCR身份证号识别技术
- 别让我们的幸福感受在别人眼中
- 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容
- jquery attr设置属性失效问题
- 钰泰ETA2821,42V/1.5A降压转换器,集成OVP功能防浪涌
- 2022年全国最新消防设施操作员模拟试题题库及答案
- LuaBox积木编程开发手册-精编版
- 图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
- 20220215-CTF-MISC-BUUCTF-小明的保险箱-binwalk分析-dd命令分离出RAR文件-ARCHPR暴力破解密码
- qq机器人如何滑动验证码验证TxCaptchaHelper
- 3dmax常用快捷键来了!!
- 地球坐标,火星坐标,百度坐标转换
热门文章
- [Java基础]反射获取成员变量并使用练习
- 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)
- 找出第二小元素(算法导论第三版9.1-1题)
- 算法-排序-计数排序(包含对非负数和整数的排序)
- 递归函数中局部变量和全局变量
- Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)
- Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)
- Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点
- 【NOI2019】 机器人 【区间dp】【插值】【下降幂多项式】【分段函数】
- HDU4372 Count the Buildings