我们自定义注解(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元注解是Java编程语言中用于注解其他注解的特殊注解,它们定义了注解的行为和生命周期。Java 5引入了四个基本的元注解:@Documented、@Target、@Retention和@Inherited,而Java 8又添加了@Repeatable和@Native。...
Java自定义注解是Java编程语言中的一个重要特性,它允许程序员在代码中插入元数据,这些元数据可以被编译器或运行时环境用来执行特定的任务。自定义注解不仅提高了代码的可读性,还简化了代码处理,特别是在框架和库...
- @Inherited:如果一个类被@Inherited注解,那么它的所有子类都将自动继承这个注解,但只有适用于类的注解才能被继承。 2. 注解定义:注解使用`@interface`关键字定义,并且通常包含一组成员,成员可以是基本类型...
### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。...希望本文能帮助读者更好地理解和运用Spring中的注解技术。
Java中的注解(Annotation)是元数据的一种形式,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、构建工具或者运行时环境读取和处理。注解不仅有助于提升代码的可读性和可维护性,还能帮助开发者实现自动化...
在实际开发中,理解并熟练运用Java注解能够提高代码的可读性,减少错误,并简化许多自动化任务。通过合理地创建和使用注解,我们可以让代码更易于维护,同时也为工具和框架提供更多的灵活性和扩展性。因此,学习和...
理解并熟练运用元注解是提升Java编程能力的关键步骤之一,它们是Java语言中的一种强大工具,可以极大地提高代码的灵活性和可维护性。通过实际的编程练习和示例,开发者可以深入理解这些元注解的工作原理,并将其有效...
元注解是用于注解其他注解的注解,Java预定义了五种元注解:@Retention、@Target、@Documented、@Inherited 和 @Repeatable。 3.2 @Retention @Retention 定义了注解的保留策略,可以是SOURCE(源码级别,编译后...
Java注解是编程语言的一种元数据机制,它们允许程序员在代码中嵌入额外的信息,这些信息可以在编译时或运行时被编译器或虚拟机使用。Java从1.5版本开始引入注解,现在已经成为许多现代Java框架,如Hibernate、Jersey...
Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据(metadata),这些元数据不直接影响程序的执行,但可以被编译器或运行时环境用来进行各种处理,如验证、动态代理、持久化、资源管理等。...
【Android注解基础介绍快速入门与解读】 ...理解并熟练运用元注解和自定义注解,能够帮助开发者编写出更加高效、可维护的Android应用。在实际开发中,应根据需求合理选择和创建注解,以实现最佳的代码设计和优化。
### Java注解学习 #### 知识点概览 Java注解是Java 5.0引入的一个重要特性,用于向代码添加元数据,而不影响其实际功能。它们为开发过程中的自动化工具、编译器...理解和熟练运用注解是Java开发者的一项重要技能。
常见的元注解还包括`@Documented`(将注解包含在Javadoc中)、`@Inherited`(子类继承父类的注解)和`@Repeatable`(允许同一位置重复应用注解)。 5. **处理注解** 注解处理器是Java编译器的一部分,它们在编译...
Java注解,也被称为元数据,是Java编程语言中的一个重要特性,它允许程序员在源代码中插入信息,这些信息可以被编译器或运行时环境用于处理代码。注解为开发者提供了一种灵活的方式来标记代码,以实现代码的自解释性...
Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。这些信息可以用来进行编译时检查、运行时处理,或者作为配置信息。注解不是程序的一...
Java注解编程是Java语言的一种重要特性,引入于JDK1.5,它允许...理解并熟练运用注解,对于理解和编写现代Java应用程序至关重要。通过自定义注解,开发者可以创建自己的元数据系统,进一步提高代码的灵活性和可扩展性。
在Spring中,可以通过`@Retention`、`@Target`、`@Documented`和`@Inherited`等元注解来创建自定义注解。例如,你可以定义一个`@MyCustomAnnotation`,然后在需要的类上使用它,以实现特定的逻辑或行为。Spring还...
Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码验证、简化配置、实现AOP(面向切面编程)等。注解在Java世界中扮演着不...
Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,使得开发者可以在代码中添加额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在Java中扮演了多种角色,包括代码的...
理解并熟练运用注解是现代Java开发中不可或缺的一部分,它增强了代码的表达力,并简化了诸多复杂任务,如持久化、依赖注入、编译时检查等。通过阅读博客和实践上述知识点,开发者可以更好地掌握这一强大的特性。