@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. spring3: schema的aop与Aspectj的aop的区别

    schema的aop如下: 接口: package chapter6.service; public interface IHelloAroundService { public void sayAr ...

  2. hdu 5978 To begin or not to begin(概率,找规律)

    To begin or not to begin Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  3. Log4j 发送 EMail 的配置

    项目上线后,运行时往往也还会有异常发生,在异常抛出时,希望即时的得到反馈.所以需要配置LOG4J的发送EMAIL功能. 项目中原来使用的的Log4j版本为1.2.9 ,但此版本并不支持邮件服务的认证功 ...

  4. 公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer

    公有云厂商DDoS防护产品竞品分析 from:http://www.freebuf.com/articles/network/132239.html 行文初衷 由于工作关系,最近接触了很多云上用户,对 ...

  5. 启动代码之开iCache

    1.什么是cache,有什么用    cache是一种内存,叫高速缓存.从容量来说:CPU < 寄存器 < cache < DDR从速度来说:CPU > 寄存器 > ca ...

  6. 《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例

    3.1 Hello World 实例 在上一章中介绍了Drools5x版本中规则引擎使用的实例,很明显在Drools7中KnowledgeBase类已经标注为"@Deprecated&quo ...

  7. Photoshop脚本指南——Hello World

    作为一个程序猿,每一个东西的学习都是从Hello World开始的,从今天开始,让我们一起进入Photoshop脚本的世界,并以Hello World开始我们的旅程. 1.简介 Photoshop支持 ...

  8. 用 WEKA 进行数据挖掘 ——第一章:简介

    1.简介数据挖掘.机器学习这些字眼,在一些人看来,是门槛很高的东西.诚然,如果做算法实现甚至算法优化,确实需要很多背景知识.但事实是,绝大多数数据挖掘工程师,不需要去做算法层面的东西.他们的精力,集中 ...

  9. golang包快速生成base64验证码

    base64Captcha快速生成base64编码图片验证码字符串 支持多种样式,算术,数字,字母,混合模式,语音模式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一.Base6 ...

  10. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...