今天在学习 Open Feign 的时候,提到了它的继承特性,解决接口不统一不好维护的问题。我以为这是Java注解的功劳,后来查阅资料发现居然不是,Java注解的继承要靠 @Inherit 。
本文的测试参考了这篇文章:
https://www.iteye.com/blog/elf8848-1621392
自定义了一个注解 TestAnnotation :
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface TestAnnotation {String value();}
测试项如下:
- 子类继承父类,不实现不覆盖
- 子类继承父类,实现父方法
- 子类继承父类,覆盖父方法
案例1
父类如下所示:
@TestAnnotation("parent class")public abstract class Parent {@TestAnnotation("do implementation")public abstract void doImplementation();@TestAnnotation("do override")public void doOverride(){System.out.println("parent doOverride");}@TestAnnotation("just call")public void justCall(){System.out.println("just call");}}
子类如下:
public class Son extends Parent{@Overridepublic void doImplementation() {System.out.println("son doImplementation");}@Overridepublic void doOverride() {System.out.println("son do override");}}
Main方法:
public static void main(String[] args) throws NoSuchMethodException {Method doImplementationMethod = Son.class.getMethod("doImplementation");if(doImplementationMethod.isAnnotationPresent(TestAnnotation.class)){System.out.println("子类继承了父类的 doImplementation的注解");}Method doOverrideMethod = Son.class.getMethod("doOverride");if(doOverrideMethod.isAnnotationPresent(TestAnnotation.class)){System.out.println("子类继承了父类的 doOverride 的注解");}Method justCallMethod = Son.class.getMethod("justCall");if(justCallMethod.isAnnotationPresent(TestAnnotation.class)){System.out.println("子类继承了父类 justCall 的注解");}if(Son.class.isAnnotationPresent(TestAnnotation.class)){System.out.println("子类继承了父类 类级别的注解");}}
最终结果:
案例2
现在给 TestAnnotation 增加一个 @Inherited 注解,最终结果
总结
| 自定义注解无@Inherited | 自定义注解有@Inherited | |
|---|---|---|
| 子类 继承 父类的 类级别注解 | 不能继承注解 | 能继承注解 |
| 子类 实现 父类的 抽象方法 | 不能继承注解 | 不能继承注解 |
| 子类 覆写 父类的 方法 | 不能继承注解 | 不能继承注解 |
| 子类 继承 父类的 方法 | 能继承注解 | 能继承注解 |
