今天在学习 Open Feign 的时候,提到了它的继承特性,解决接口不统一不好维护的问题。我以为这是Java注解的功劳,后来查阅资料发现居然不是,Java注解的继承要靠 @Inherit

本文的测试参考了这篇文章:
https://www.iteye.com/blog/elf8848-1621392

自定义了一个注解 TestAnnotation

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface TestAnnotation {
  4. String value();
  5. }

测试项如下:

  • 子类继承父类,不实现不覆盖
  • 子类继承父类,实现父方法
  • 子类继承父类,覆盖父方法

案例1

父类如下所示:

  1. @TestAnnotation("parent class")
  2. public abstract class Parent {
  3. @TestAnnotation("do implementation")
  4. public abstract void doImplementation();
  5. @TestAnnotation("do override")
  6. public void doOverride(){
  7. System.out.println("parent doOverride");
  8. }
  9. @TestAnnotation("just call")
  10. public void justCall(){
  11. System.out.println("just call");
  12. }
  13. }

子类如下:

  1. public class Son extends Parent{
  2. @Override
  3. public void doImplementation() {
  4. System.out.println("son doImplementation");
  5. }
  6. @Override
  7. public void doOverride() {
  8. System.out.println("son do override");
  9. }
  10. }

Main方法:

  1. public static void main(String[] args) throws NoSuchMethodException {
  2. Method doImplementationMethod = Son.class.getMethod("doImplementation");
  3. if(doImplementationMethod.isAnnotationPresent(TestAnnotation.class)){
  4. System.out.println("子类继承了父类的 doImplementation的注解");
  5. }
  6. Method doOverrideMethod = Son.class.getMethod("doOverride");
  7. if(doOverrideMethod.isAnnotationPresent(TestAnnotation.class)){
  8. System.out.println("子类继承了父类的 doOverride 的注解");
  9. }
  10. Method justCallMethod = Son.class.getMethod("justCall");
  11. if(justCallMethod.isAnnotationPresent(TestAnnotation.class)){
  12. System.out.println("子类继承了父类 justCall 的注解");
  13. }
  14. if(Son.class.isAnnotationPresent(TestAnnotation.class)){
  15. System.out.println("子类继承了父类 类级别的注解");
  16. }
  17. }

最终结果:
image.png

案例2

现在给 TestAnnotation 增加一个 @Inherited 注解,最终结果
image.png

总结

自定义注解@Inherited 自定义注解@Inherited
子类 继承 父类的 类级别注解 不能继承注解 继承注解
子类 实现 父类的 抽象方法 不能继承注解 不能继承注解
子类 覆写 父类的 方法 不能继承注解 不能继承注解
子类 继承 父类的 方法 继承注解 继承注解