@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注解继承情况的更多相关文章

  1. Servlet 3.0 规范(二)注解驱动和异步请求

    Servlet 3.0 规范(二)注解驱动和异步请求 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 一.Servlet 3.0 组件 Servlet 容器的组件大致 ...

  2. Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils

    Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...

  3. spring boot: @Retention注解 @Documented 注解 @Inherited 注解

    http://www.jb51.net/article/55371.htm Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:1.Retenti ...

  4. Spring 注解(二)注解工具类

    本文转载自Spring 注解(二)注解工具类 导语 首先回顾一下 AnnotationUtils 和 AnnotatedElementUtils 这两个注解工具类的用法: @Test @GetMapp ...

  5. 深入理解OOP(二):多态和继承(继承)

    本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...

  6. 深入理解Java的注解(Annotation):自定义注解入门(2)

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  7. 深入理解Java:注解(Annotation)自己定义注解入门

    深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的 ...

  8. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  9. Annotation之三:自定义注解示例,利用反射进行解析

    @Retention定义了该Annotation被保留的时间长短有3中RetentionPolicy.SOURCE源文件有效,RetentionPolicy.CLASS:在class文件中有效,Ret ...

随机推荐

  1. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  2. caffe2 教程入门(python版)

    学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...

  3. 使用ConcurrentLinkedQueue惨痛的教训

    服务端原本有个定时任务对一个集合ArrayList 中的消息做处理. 因为考虑到处理消息是先进先出原则,所以优化的时候考虑改用ConcurrentLinkedQueue 当时没仔细深入研究过这个集合就 ...

  4. 在oracle中插入数据报错:ORA-00984列在此处不允许

    这里报错的原因就是当数据类型varchar2时没有使用单引号. 没写单引号,不管是双引号还是什么都没写都会报这个错误.

  5. 资源(GitHub)

    angular 文档 https://angular.cn/docs/ts/latest/quickstart.html   http://sc.qq.com/fx/u?r=OfFE5AA ios h ...

  6. git生成和检查秘钥操作

    查看本地是否有git config的配置: git config --list 设置用户名和邮箱: $git config --global user.email "tanteng@gmai ...

  7. mongodb停止遇到shutdownServer failed: unauthorized: this command must run from localhost when running db without auth解决方法

    停止mongodb use admin db.shutdownServer(); mongos> db.shutdownServer(); assert failed : unexpected ...

  8. 用Spring和c3p0工具简单的实现增删改查

    1.导入Spring和c3p0的jar包 2.配置beans.xml文件 <?xml version="1.0" encoding="UTF-8"?> ...

  9. OC-Foundation框架

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber]================ ...

  10. 在Virtualbox虚拟机中配置使用ROS Spark机器人(Orbbec Astra 和 Xtion)

    在虚拟机中配置使用ROS Spark,在Virtualbox中使用USB外设包括Orbbec Astra 和 Xtion深度摄像头和底盘. 虚拟机使用外接设备时,会遇到一些问题.不过随着虚拟机功能的逐 ...