我有一个带注释方法的接口。注释标有@Inherited
,所以我希望实现者继承它。但是,事实并非如此:
代码:
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Example {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
TestInterface obj = new TestInterface() {
@Override
public void m() {}
};
printMethodAnnotations(TestInterface.class.getMethod("m"));
printMethodAnnotations(obj.getClass().getMethod("m"));
}
private static void printMethodAnnotations(Method m) {
System.out.println(m + ": " + Arrays.toString(m.getAnnotations()));
}
}
interface TestInterface {
@TestAnnotation
public void m();
}
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@interface TestAnnotation {}
上面的代码打印:
公共抽象 void annotations.TestInterface.m(): [@annotations.TestAnnotation()]
public void annotations.Example$1.m(): []
obj.m()
所以问题是@TestAnnotation
尽管它实现了一个标记为@TestAnnotation
is的方法,但为什么没有@Inherited
呢?