Annotation之二:@Inherited注解继承情况
@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
子类中能否继承注解如下:(类和接口情况)


上面的结果同样适用子类的子类。
示例1:自定义注解标记在类上的继承情况
1、自定义注解
package com.dxz.annotation.demo; import java.lang.annotation.Inherited;
import java.lang.annotation.Retention; @Inherited // 可以被继承
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) // 可以通过反射读取注解
public @interface BatchExec {
String value();
}
2、被注解的父类
package com.dxz.annotation.demo; @BatchExec(value = "类名上的注解")
public abstract class ParentClass { @BatchExec(value = "父类的abstractMethod方法")
public abstract void abstractMethod(); @BatchExec(value = "父类的doExtends方法")
public void doExtends() {
System.out.println(" ParentClass doExtends ...");
} @BatchExec(value = "父类的doHandle方法")
public void doHandle() {
System.out.println(" ParentClass doHandle ...");
} //@BatchExec(value = "父类的doHandle方法")
public void doHandle2() {
System.out.println(" ParentClass doHandle ...");
}
}
子类:
package com.dxz.annotation.demo;
public class SubClass1 extends ParentClass {
// 子类实现父类的抽象方法
@Override
public void abstractMethod() {
System.out.println("子类实现父类的abstractMethod抽象方法");
}
//子类继承父类的doExtends方法
// 子类覆盖父类的doHandle方法
@Override
public void doHandle() {
System.out.println("子类覆盖父类的doHandle方法");
}
}
测试类:
package com.dxz.annotation.demo;
import java.lang.reflect.Method;
public class MainTest1 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class<SubClass1> clazz = SubClass1.class;
if (clazz.isAnnotationPresent(BatchExec.class)) {
BatchExec cla = clazz.getAnnotation(BatchExec.class);
System.out.println("类:子类可继承,注解读取='" + cla.value() + "'");
} else {
System.out.println("类:子类不能继承到父类类上Annotation");
}
// 实现抽象方法测试
Method method = clazz.getMethod("abstractMethod", new Class[] {});
if (method.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = method.getAnnotation(BatchExec.class);
System.out.println("子类实现抽象方法:子类可继承,注解读取='" + ma.value() + "'");
} else {
System.out.println("子类实现抽象方法:没有继承到父类抽象方法中的Annotation");
}
// 子类未重写的方法
Method methodOverride = clazz.getMethod("doExtends", new Class[] {});
if (methodOverride.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = methodOverride.getAnnotation(BatchExec.class);
System.out.println("子类未实现方法:子类可继承,注解读取='" + ma.value() + "'");
} else {
System.out.println("子类未实现方法:没有继承到父类doExtends方法中的Annotation");
}
// 子类重写的方法
Method method3 = clazz.getMethod("doHandle", new Class[] {});
if (method3.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = method3.getAnnotation(BatchExec.class);
System.out.println("子类覆盖父类的方法:继承到父类doHandle方法中的Annotation,其信息如下:" + ma.value());
} else {
System.out.println("子类覆盖父类的方法:没有继承到父类doHandle方法中的Annotation");
}
// 子类重写的方法
Method method4 = clazz.getMethod("doHandle2", new Class[] {});
if (method4.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = method4.getAnnotation(BatchExec.class);
System.out.println("子类未实现方法doHandle2:子类可继承,注解读取='" + ma.value());
} else {
System.out.println("子类未实现方法doHandle2:没有继承到父类doHandle2方法中的Annotation");
}
}
}
结果:
类:子类可继承,注解读取='类名上的注解'--场景2
子类实现抽象方法:没有继承到父类抽象方法中的Annotation--场景4
子类未实现方法:子类可继承,注解读取='父类的doExtends方法'--场景6
子类覆盖父类的方法:没有继承到父类doHandle方法中的Annotation--场景8
子类未实现方法doHandle2:没有继承到父类doHandle2方法中的Annotation--场景5
示例2:自定义注解标记在接口上的继承情况
package com.dxz.annotation.demo3; @BatchExec(value = "接口上的注解")
public interface Parent {
void abstractMethod();
}
接口的继承类
package com.dxz.annotation.demo3; import com.dxz.annotation.BatchExec; ///@BatchExec(value = "类名上的注解")
public abstract class ParentClass3 { public void abstractMethod() {
System.out.println("ParentClass3");
} @BatchExec(value = "父类中新增的doExtends方法")
public void doExtends() {
System.out.println(" ParentClass doExtends ...");
}
}
该继承类的注解可见测试:
package com.dxz.annotation.demo3;
import java.lang.reflect.Method;
import com.dxz.annotation.BatchExec;
public class MainTest3 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class<ParentClass3> clazz = ParentClass3.class;
if (clazz.isAnnotationPresent(BatchExec.class)) {
BatchExec cla = clazz.getAnnotation(BatchExec.class);
System.out.println("类:子类可继承,注解读取='" + cla.value()+"'");
} else {
System.out.println("类:子类不能继承到接口类上Annotation");
}
// 实现抽象方法测试
Method method = clazz.getMethod("abstractMethod", new Class[] {});
if (method.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = method.getAnnotation(BatchExec.class);
System.out.println("子类实现抽象方法:子类可继承,注解读取='" + ma.value()+"'");
} else {
System.out.println("子类实现抽象方法:没有继承到接口抽象方法中的Annotation");
}
//子类中新增方法
Method methodOverride = clazz.getMethod("doExtends", new Class[] {});
if (methodOverride.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = methodOverride.getAnnotation(BatchExec.class);
System.out.println("子类中新增方法:注解读取='" + ma.value()+"'");
} else {
System.out.println("子类中新增方法:不能读取注解");
}
}
}
结果:
类:子类不能继承到接口类上Annotation--场景12
子类实现抽象方法:没有继承到接口抽象方法中的Annotation--场景14
子类中新增方法:注解读取='父类中新增的doExtends方法'--场景16
子类的子类注解继承情况:
package com.dxz.annotation.demo3;
public class SubClass3 extends ParentClass3 {
// 子类实现父类的抽象方法
@Override
public void abstractMethod() {
System.out.println("子类实现父类的abstractMethod抽象方法");
}
// 子类覆盖父类的doExtends方法
}
测试类:
package com.dxz.annotation.demo3;
import java.lang.reflect.Method;
import com.dxz.annotation.BatchExec;
public class MainTest33 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class<SubClass3> clazz = SubClass3.class;
if (clazz.isAnnotationPresent(BatchExec.class)) {
BatchExec cla = clazz.getAnnotation(BatchExec.class);
System.out.println("类:子类可继承,注解读取='" + cla.value()+"'");
} else {
System.out.println("类:子类不能继承到父类类上Annotation");
}
// 实现抽象方法测试
Method method = clazz.getMethod("abstractMethod", new Class[] {});
if (method.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = method.getAnnotation(BatchExec.class);
System.out.println("子类实现抽象方法:子类可继承,注解读取='" + ma.value()+"'");
} else {
System.out.println("子类实现抽象方法:没有继承到父类抽象方法中的Annotation");
}
//子类未重写的方法
Method methodOverride = clazz.getMethod("doExtends", new Class[] {});
if (methodOverride.isAnnotationPresent(BatchExec.class)) {
BatchExec ma = methodOverride.getAnnotation(BatchExec.class);
System.out.println("子类未实现方法:子类可继承,注解读取='" + ma.value()+"'");
} else {
System.out.println("子类未实现方法:没有继承到父类doExtends方法中的Annotation");
}
}
}
结果:
类:子类不能继承到父类类上Annotation
子类实现抽象方法:没有继承到父类抽象方法中的Annotation--场景14
子类未实现方法:子类可继承,注解读取='父类中新增的doExtends方法'--场景18
附注
-----------------------------------------------------------------
Spring 实现事务的注解@Transactional 是可以被继承的,
通过查看它的源码可以看到@Inherited。
Annotation之二:@Inherited注解继承情况的更多相关文章
- Servlet 3.0 规范(二)注解驱动和异步请求
Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...
- Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils
Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...
- spring boot: @Retention注解 @Documented 注解 @Inherited 注解
http://www.jb51.net/article/55371.htm Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:1.Retenti ...
- Spring 注解(二)注解工具类
本文转载自Spring 注解(二)注解工具类 导语 首先回顾一下 AnnotationUtils 和 AnnotatedElementUtils 这两个注解工具类的用法: @Test @GetMapp ...
- 深入理解OOP(二):多态和继承(继承)
本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...
- 深入理解Java的注解(Annotation):自定义注解入门(2)
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...
- 深入理解Java:注解(Annotation)自己定义注解入门
深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- Annotation之三:自定义注解示例,利用反射进行解析
@Retention定义了该Annotation被保留的时间长短有3中RetentionPolicy.SOURCE源文件有效,RetentionPolicy.CLASS:在class文件中有效,Ret ...
随机推荐
- root run-parts
crontab的文件格式 分 时 日 月 星期 要运行的命令 第1列分钟0-59 第2列小时0-23(0表示子夜) 第3列日1-31 第4列月1-12 第5列星期0-7(0和7表示星期天) 第6列要运 ...
- NumPy统计函数
NumPy - 统计函数 NumPy 有很多有用的统计函数,用于从数组中给定的元素中查找最小,最大,百分标准差和方差等. 函数说明如下: numpy.amin() 和 numpy.amax() 这些函 ...
- css滚动相关问题记录
1) 关于滑动加速优化,可以通过css进行处理 例如,html如下: <div class="content-dialog"> <h1>活动规则</h ...
- shell awk使用(转)
#####awk " 对每一行操作的代码块" 操作的文件 awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh 打印字段 ...
- nyoj-5-kmp裸题
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=5 kmp统计匹配串出现次数,贼尴尬好久没做字符串题目,一开始求得是文本串的next ...
- CountDownLatch闭锁
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...
- 下载并安装Prism5.0库(纯汉语版)
Prism5.0中包含了文档,WPF代码示例,程序集.本篇告诉你从哪里获取程序集和代码示例,还有NuGet包的内容. 对于新功能,资产,和API的更改信息,请看Prism5.0新内容. 文档 Pris ...
- Android 系统信息的获取
Android 系统信息的获取 一.内存(ram): 1.android 的内存大小信息存放在系统的 /proc/meminfo 文件里面,通过adb shell 进入 手机目录后,使用 cat /p ...
- AlexNet神经网络结构
Alexnet是2014年Imagenet竞赛的冠军模型,准确率达到了57.1%, top-5识别率达到80.2%. AlexNet包含5个卷积层和3个全连接层,模型示意图: 精简版结构: conv1 ...
- [Luogu3769][CH弱省胡策R2]TATT
luogu 题意 其实就是四维偏序. sol 第一维排序,然后就只需要写个\(3D-tree\)了. 据说\(kD-tree\)的单次查询复杂度是\(O(n^{1-\frac{1}{k}})\).所以 ...