今天在学习 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{
@Override
public void doImplementation() {
System.out.println("son doImplementation");
}
@Override
public 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 | |
---|---|---|
子类 继承 父类的 类级别注解 | 不能继承注解 | 能继承注解 |
子类 实现 父类的 抽象方法 | 不能继承注解 | 不能继承注解 |
子类 覆写 父类的 方法 | 不能继承注解 | 不能继承注解 |
子类 继承 父类的 方法 | 能继承注解 | 能继承注解 |