【发布时间】:2015-06-26 09:20:45
【问题描述】:
我目前遇到了与 Java 的泛型类型擦除和运行时注释有关的问题,我不确定是我做错了什么还是 Java 编译器中的错误。考虑以下最小的工作示例:
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
}
public interface MyGenericInterface<T> {
void hello(T there);
}
public class MyObject {
}
public class MyClass implements MyGenericInterface<MyObject> {
@Override
@MyAnnotation
public void hello(final MyObject there) {
}
}
现在,当我通过反射查询有关 MyClass.hello 的信息时,我希望 hello 方法仍然具有注释,但它没有:
public class MyTest {
@Test
public void testName() throws Exception {
Method[] declaredMethods = MyClass.class.getDeclaredMethods();
for (Method method : declaredMethods) {
Assert.assertNotNull(String.format("Method '%s' is not annotated.", method), method
.getAnnotation(MyAnnotation.class));
}
}
}
(意外)错误消息如下:
java.lang.AssertionError: 方法'public void test.MyClass.hello(java.lang.Object)' 没有注释。
使用 Java 1.7.60 测试。
【问题讨论】:
-
您认为哪个更有可能是代码中的错误或 Java 编译器中的错误?
-
如果你从接口/类中删除类型参数,你会得到什么?
-
我无法使用 Java 7u80 和 Java 8u45 重现此问题。你确定你编译的类文件是最新的吗?
-
您的样本工作正常。见here。
-
看起来它也被认为是一个错误:bugs.java.com/view_bug.do?bug_id=6695379
标签: java generics reflection annotations