我们自定义注解(Annotation)时,把自定义的注解标注在父类上不会被子类所继承,但是我们可以在定义注解时给我们自定义的注解标注一个@Inherited注解来实现注解继承。
自定义的注解代码如下:
package com.xdf.annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
@Inherited
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
String value();
}
接着定义一个抽象父类
代码如下:
package com.xdf.annotation;
public abstract class AbstractParent {
@InheritedAnnotation(value = "parent abstractMethod ")
public abstract void abstractMethod();
@InheritedAnnotation(value = "Parent's doExtends")
public void doExtends() {
System.out.println(" AbstractParent doExtends ...");
}
}
我们把自定义的注解父类里的方法上。
接着定义一个继承抽象父类(AbstractParent)的子类
代码如下:
package com.xdf.annotation;
public class SubClassImpl extends AbstractParent{
@Override
public void abstractMethod() {
System.out.println("子类实现抽象父类的抽象方法");
}
}
在子类中实现了abstractMethod抽象方法,没有重写doExtends方法。
测试类代码如下:
package com.xdf.annotation;
import java.lang.reflect.Method;
public class InheritedAnnotationTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class<SubClassImpl> clazz=SubClassImpl.class;
//abstractMethod
Method method = clazz.getMethod("abstractMethod", new Class[]{});
if(method.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation ma = method.getAnnotation(InheritedAnnotation.class);
System.out.println("子类实现的抽象方法继承到父类抽象方法中的Annotation,其信息如下:");
System.out.println(ma.value());
}else{
System.out.println("子类实现的抽象方法没有继承到父类抽象方法中的Annotation");
}
Method methodOverride = clazz.getMethod("doExtends", new Class[]{});
if(methodOverride.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation ma = methodOverride.getAnnotation(InheritedAnnotation.class);
System.out.println("子类doExtends方法继承到父类doExtends方法中的Annotation,其信息如下:");
System.out.println(ma.value());
}else{
System.out.println("子类doExtends方法没有继承到父类doExtends方法中的Annotation");
}
}
}
运行结果如下:
子类实现的抽象方法没有继承到父类抽象方法中的Annotation
子类doExtends方法继承到父类doExtends方法中的Annotation,其信息如下:
Parent's doExtends
从以上代码运行的结果可以得到如下结论:
1.如果子类继承父类,并且重写了父类中的带有注解的方法,那么父类方法上的注解是不会被子类继承的。
2.如果子类继承父类,但是没有重写父类中带有注解的方法,那么父类方法上的注解会被子类继承,就是说在子类中可以得到父类方法上的注解。
但是.....但是....当我把自定义的注解上的@Inherited注解去掉运行,结果还是一样,也就是说这个@Inherited注解根本没有起作用。这是什么神马情况呢?
接着我把没有标注@Inherited注解的自定义的注解标注在类级别上(不是方法级别上),把抽象父类改成下面这样:
package com.xdf.annotation;
@InheritedAnnotation(value="parent") //把自定义注解标注在父类上
public abstract class AbstractParent {
@InheritedAnnotation(value = "parent abstractMethod ")
public abstract void abstractMethod();
@InheritedAnnotation(value = "Parent's doExtends")
public void doExtends() {
System.out.println(" AbstractParent doExtends ...");
}
}
然后在测试类的main方法里加了如下测试代码:
if(clazz.isAnnotationPresent(InheritedAnnotation.class)){
InheritedAnnotation cla = clazz.getAnnotation(InheritedAnnotation.class);
System.out.println("子类继承到父类类上Annotation,其信息如下:");
System.out.println(cla.value());
}else{
System.out.println("子类没有继承到父类类上Annotation");
}
这是出现情况了,运行main方法得到结果:
子类实现的抽象方法没有继承到父类抽象方法中的Annotation
子类doExtends方法继承到父类doExtends方法中的Annotation,其信息如下:
Parent's doExtends
子类没有继承到父类类上Annotation
从运行结果中可以发现子类并没有继承父类类级别的注解,于是我又把@Inherited注解标注在自定义注解上,然后运行一下,得到如下结果:
子类实现的抽象方法没有继承到父类抽象方法中的Annotation
子类doExtends方法继承到父类doExtends方法中的Annotation,其信息如下:
Parent's doExtends
子类继承到父类类上Annotation,其信息如下:
parent
注意运行结果,子类继承了父类类级别的注解了。
这说明什么呢?
说明这种标有@Inherited注解的自定义的注解运用到类级别上和方法级别上是不一样的,如果把标有@Inherited注解的自宝义的注解标注在类级别上,子类则可以继承父类类级别的注解,反之,则不行。
分享到:
相关推荐
主要介绍了java元注解@Inherited的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
帮助大家复习java基础知识其中有 hashCode 2 toString 2 finalize 2 用已学知识做出简单的房屋出租系统 3 类方法使用注意事项和细节讨论 4 ...@Inherited 注解 20 异常-Exception 21 编译异常 22 异常处理 2
Java5.0定义的元注解: 1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited 这些类型和它们所⽀持的类在java.lang.annotation包中可以找到。下⾯我们看⼀下每个元注解的作⽤和相应分参数的使⽤说明。 ...
带有Inherited注解的service文件,包含java源文件和编译后的class文件,可用于dubbo+zookeeper平台的事务处理,下载后直接将原来的server.class文件替换即可
主要介绍了Java注解之Retention、Documented、Inherited注解介绍,本文内容和相关文章是系列文章,需要的朋友可以参考下
由于无论在Java后台或者Android开发中我们经常遇到注解这个功能机制,例如常用的框架Java后台开发中,Spring、MyBatis等,Android的Dagger2,butterknife等,都是注解框架。今天我们就了解java是如何进行设置注解的...
注解(Annotation)JDK5.0引入 内置注解: @Override:重写方法 @Deprecated:废弃 ...@Inherited:子类可以继承父类的注解 自定义注解 @interface 注解名{} 属性为注解的参数:可以使用默认值 反射(框架设计的
注解可以包含与其绑定的元注解,元注解为注解提供信息,有四种元注解类型:包括@Retention @Target @Document @Inherited2、@t
元注解(JDK的元Annotation)4.1.@Target4.2.@Retention4.3.@Documented4.4.@Inherited4.5.@Result四、在程序中使用(解析)注解五、案例——简单的测试框架 一、注解是什么? 从JDK5开始,Java增加对元数据的支持...
Java程序设计中关联与继承的比较Java programming associated with inherited comparison
近期接触了路由和模块间通信的内容,发现Java注解非常常用。 避免后面看各源码被其阻塞,大致了解了下,作此文记录之。 注解类型 @Target @Retention @Documented @Inherited @Target 用于描述注解的使用范围,可能...
注解的目标,使用ElementType枚举,目标可以有多个,用{}表示@Retention :注解保留到什么时候,使用RetentionPolicy ,更改RetentionPolicy.CLASS @Documented :表示注解信息包含到生成的文档中@Inherited :...
@Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType....
标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 @Documented - 标记这些注解是否包含在用户文档中。 @Target - 标记这个注解应该是哪种 Java 成员。 @Inherited - ...
目录 一 注解的定义 二 如何自定义注解 三 元注解 3.1 @Retention 3.2 @Target 3.3 @Documented 3.4 @Inherited 3.5 @Repeatable 四 Java 预置的注解 4.1 @Deprecated ...五 注解的属性 ...Java 注解是从 Java5 开
Java编程演示继承抽象函数和实现接口经典代码Java programming presentation and implementation abstract function interfaces inherited classic code
四种元注释:java.lang.annotation中的类 元注释:注释注释的注释,用来限定注释的特征 @Terget 用来限定某个注释的使用范围,可以对什么元素进行注释 @Retention 用来描述注释的有效范围 @Inherited ...
@ComponentScan @Configuration @Conditional @Retention @Documented @Target @Inherited @Bean @Import等注解含义的总结和个人理解: 包扫描@ComponentScan+组件标注注解(@Controller/@Service/@Repository/@...
3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 ...