`
xiangdefei
  • 浏览: 58274 次
  • 性别: 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元注解.docx

    Java元注解是Java编程语言中用于注解其他注解的特殊注解,它们定义了注解的行为和生命周期。Java 5引入了四个基本的元注解:@Documented、@Target、@Retention和@Inherited,而Java 8又添加了@Repeatable和@Native。...

    Java自定义注解实例

    Java自定义注解是Java编程语言中的一个重要特性,它允许程序员在代码中插入元数据,这些元数据可以被编译器或运行时环境用来执行特定的任务。自定义注解不仅提高了代码的可读性,还简化了代码处理,特别是在框架和库...

    java 注解annotation的使用以及反射如何获取注解

    - @Inherited:如果一个类被@Inherited注解,那么它的所有子类都将自动继承这个注解,但只有适用于类的注解才能被继承。 2. 注解定义:注解使用`@interface`关键字定义,并且通常包含一组成员,成员可以是基本类型...

    Spring java注解,元注解和自定义注解

    ### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。...希望本文能帮助读者更好地理解和运用Spring中的注解技术。

    (转)Java中的注解是如何工作的?

    Java中的注解(Annotation)是元数据的一种形式,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、构建工具或者运行时环境读取和处理。注解不仅有助于提升代码的可读性和可维护性,还能帮助开发者实现自动化...

    JAVA 注解示例 详解

    在实际开发中,理解并熟练运用Java注解能够提高代码的可读性,减少错误,并简化许多自动化任务。通过合理地创建和使用注解,我们可以让代码更易于维护,同时也为工具和框架提供更多的灵活性和扩展性。因此,学习和...

    java元注解的介绍说明

    理解并熟练运用元注解是提升Java编程能力的关键步骤之一,它们是Java语言中的一种强大工具,可以极大地提高代码的灵活性和可维护性。通过实际的编程练习和示例,开发者可以深入理解这些元注解的工作原理,并将其有效...

    Java Annotation手册

    元注解是用于注解其他注解的注解,Java预定义了五种元注解:@Retention、@Target、@Documented、@Inherited 和 @Repeatable。 3.2 @Retention @Retention 定义了注解的保留策略,可以是SOURCE(源码级别,编译后...

    Java中的注解及自定义注解使用详解.docx

    Java注解是编程语言的一种元数据机制,它们允许程序员在代码中嵌入额外的信息,这些信息可以在编译时或运行时被编译器或虚拟机使用。Java从1.5版本开始引入注解,现在已经成为许多现代Java框架,如Hibernate、Jersey...

    java 注解

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据(metadata),这些元数据不直接影响程序的执行,但可以被编译器或运行时环境用来进行各种处理,如验证、动态代理、持久化、资源管理等。...

    Android注解基础介绍快速入门与解读

    【Android注解基础介绍快速入门与解读】 ...理解并熟练运用元注解和自定义注解,能够帮助开发者编写出更加高效、可维护的Android应用。在实际开发中,应根据需求合理选择和创建注解,以实现最佳的代码设计和优化。

    Java注解学习

    ### Java注解学习 #### 知识点概览 Java注解是Java 5.0引入的一个重要特性,用于向代码添加元数据,而不影响其实际功能。它们为开发过程中的自动化工具、编译器...理解和熟练运用注解是Java开发者的一项重要技能。

    关于java注解比较详细的例子

    常见的元注解还包括`@Documented`(将注解包含在Javadoc中)、`@Inherited`(子类继承父类的注解)和`@Repeatable`(允许同一位置重复应用注解)。 5. **处理注解** 注解处理器是Java编译器的一部分,它们在编译...

    最全Java注解图文超详解(建议收藏)

    Java注解,也被称为元数据,是Java编程语言中的一个重要特性,它允许程序员在源代码中插入信息,这些信息可以被编译器或运行时环境用于处理代码。注解为开发者提供了一种灵活的方式来标记代码,以实现代码的自解释性...

    java注解annotation.rar

    Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。这些信息可以用来进行编译时检查、运行时处理,或者作为配置信息。注解不是程序的一...

    Java注解编程1

    Java注解编程是Java语言的一种重要特性,引入于JDK1.5,它允许...理解并熟练运用注解,对于理解和编写现代Java应用程序至关重要。通过自定义注解,开发者可以创建自己的元数据系统,进一步提高代码的灵活性和可扩展性。

    Spring注解和扫包自定义注解和自动扫包.rar

    在Spring中,可以通过`@Retention`、`@Target`、`@Documented`和`@Inherited`等元注解来创建自定义注解。例如,你可以定义一个`@MyCustomAnnotation`,然后在需要的类上使用它,以实现特定的逻辑或行为。Spring还...

    Java注解笔记源代码

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码验证、简化配置、实现AOP(面向切面编程)等。注解在Java世界中扮演着不...

    全面解析java注解PPT学习教案.pptx

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,使得开发者可以在代码中添加额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在Java中扮演了多种角色,包括代码的...

    使用annotation获取实体类注释

    理解并熟练运用注解是现代Java开发中不可或缺的一部分,它增强了代码的表达力,并简化了诸多复杂任务,如持久化、依赖注入、编译时检查等。通过阅读博客和实践上述知识点,开发者可以更好地掌握这一强大的特性。

Global site tag (gtag.js) - Google Analytics