@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. HDFS集群启动的常见问题

    hdfs集群启动的常见问题 1.用浏览器访问namenode的50070端口,不正常,需要诊断问题出在哪里: a.在服务器的终端命令行使用jps查看相关进程 观察节点是否存活 b.如果已经知道了启动失 ...

  2. yii2: 上传图片,生成目录

    1.单个文件上传 首先建立一个模型models/UploadForm.php,内容如下 namespace app\models; use yii\base\Model; use yii\web\Up ...

  3. No mojo definitions

    pom.xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</gro ...

  4. Tavas and Karafs 二分+结论

    二分比较容易想到 #include<map> #include<set> #include<cmath> #include<queue> #includ ...

  5. 【Java】Serializable 接口

     本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4356840.html 参考资料: http://xiebh.iteye.com/b ...

  6. elasticsearch 2.2+ index.codec: best_compression启用压缩

    官方说法,来自https://www.elastic.co/guide/en/elasticsearch/reference/2.2/index-modules.html#_static_index_ ...

  7. oracle 常用的系统表查询

    (转自:http://blog.csdn.net/marshalchen/article/details/6552103) select * from user_tab_cols where colu ...

  8. Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试

    Struts2  用过滤器代替了 servlet ,????  且不需要tomcat就可以直接做功能测试

  9. New Concept English three (27)

    35w/m 67 It has been said that everyone lives by selling something. In the light of this statement, ...

  10. 使用sessionStorage实现页面间传值与传对象

    问题描述:业务从A页面跳转到B页面,需要由A页面向B页面传入一个对象.B页面解析对象中的值,然后根据这些值做具体的业务逻辑. 一般的传值方法如下: A页面跳转到B页面时: b.html?xxx=xxx ...