`
xiangdefei
  • 浏览: 57398 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java中@Inherited注解的运用

阅读更多
  我们自定义注解(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注解的自宝义的注解标注在类级别上,子类则可以继承父类类级别的注解,反之,则不行。
1
3
分享到:
评论
2 楼 lemon_gogogo 2015-08-23  
看看这个http://blog.csdn.net/lemon89/article/details/47836783
1 楼 lemon_gogogo 2015-08-23  
赶紧删了把。。错了        This annotation applies only to class declarations.

相关推荐

    java元注解@Inherited的使用详解

    主要介绍了java元注解@Inherited的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    观看韩顺平学习整理java的笔记到异常

    帮助大家复习java基础知识其中有 hashCode 2 toString 2 finalize 2 用已学知识做出简单的房屋出租系统 3 类方法使用注意事项和细节讨论 4 ...@Inherited 注解 20 异常-Exception 21 编译异常 22 异常处理 2

    Java中三种标准注解和四种元注解.pdf

    Java5.0定义的元注解:  1.@Target,  2.@Retention,  3.@Documented,  4.@Inherited  这些类型和它们所⽀持的类在java.lang.annotation包中可以找到。下⾯我们看⼀下每个元注解的作⽤和相应分参数的使⽤说明。 ...

    带有Inherited注解的service

    带有Inherited注解的service文件,包含java源文件和编译后的class文件,可用于dubbo+zookeeper平台的事务处理,下载后直接将原来的server.class文件替换即可

    Java注解之Retention、Documented、Inherited介绍

    主要介绍了Java注解之Retention、Documented、Inherited注解介绍,本文内容和相关文章是系列文章,需要的朋友可以参考下

    java8源码-Annotation_demo:Annotation_demo

    由于无论在Java后台或者Android开发中我们经常遇到注解这个功能机制,例如常用的框架Java后台开发中,Spring、MyBatis等,Android的Dagger2,butterknife等,都是注解框架。今天我们就了解java是如何进行设置注解的...

    JavaSE-注解与反射(框架底层实现机制)

    注解(Annotation)JDK5.0引入 内置注解: @Override:重写方法 @Deprecated:废弃 ...@Inherited:子类可以继承父类的注解 自定义注解 @interface 注解名{} 属性为注解的参数:可以使用默认值 反射(框架设计的

    31.1、自定义注解1

    注解可以包含与其绑定的元注解,元注解为注解提供信息,有四种元注解类型:包括@Retention @Target @Document @Inherited2、@t

    Java语言高级部分之注解是什么?

    元注解(JDK的元Annotation)4.1.@Target4.2.@Retention4.3.@Documented4.4.@Inherited4.5.@Result四、在程序中使用(解析)注解五、案例——简单的测试框架 一、注解是什么?  从JDK5开始,Java增加对元数据的支持...

    Java-programming-associated-with-inherited-compari_Inherited

    Java程序设计中关联与继承的比较Java programming associated with inherited comparison

    android 注解入门(Acitivity路由demo)

    近期接触了路由和模块间通信的内容,发现Java注解非常常用。 避免后面看各源码被其阻塞,大致了解了下,作此文记录之。 注解类型 @Target @Retention @Documented @Inherited @Target 用于描述注解的使用范围,可能...

    鹦鹉:像鹦鹉一样学习Java;

    注解的目标,使用ElementType枚举,目标可以有多个,用{}表示@Retention :注解保留到什么时候,使用RetentionPolicy ,更改RetentionPolicy.CLASS @Documented :表示注解信息包含到生成的文档中@Inherited :...

    @SpringBootApplication注解到底做了什么,你真的了解吗?

    @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType....

    Java版水果管理系统源码-huihe_2020summer:2020假期spring学习,vue留给你们了,有兴趣自己可以看官方文档,中文很

    标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 @Documented - 标记这些注解是否包含在用户文档中。 @Target - 标记这个注解应该是哪种 Java 成员。 @Inherited - ...

    Java内功修炼系列:注解(Annotation)

    目录 一 注解的定义 二 如何自定义注解 三 元注解 3.1 @Retention 3.2 @Target 3.3 @Documented 3.4 @Inherited 3.5 @Repeatable 四 Java 预置的注解 4.1 @Deprecated ...五 注解的属性 ...Java 注解是从 Java5 开

    Java_inherit_abstract_function_interfaces_classic__Inherited

    Java编程演示继承抽象函数和实现接口经典代码Java programming presentation and implementation abstract function interfaces inherited classic code

    \java超强笔记(超级经典)

    四种元注释:java.lang.annotation中的类 元注释:注释注释的注释,用来限定注释的特征 @Terget 用来限定某个注释的使用范围,可以对什么元素进行注释 @Retention 用来描述注释的有效范围 @Inherited ...

    总结Spring注解第一篇

    @ComponentScan @Configuration @Conditional @Retention @Documented @Target @Inherited @Bean @Import等注解含义的总结和个人理解: 包扫描@ComponentScan+组件标注注解(@Controller/@Service/@Repository/@...

    java基础案例与开发详解案例源码全

    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 ...

Global site tag (gtag.js) - Google Analytics