我正在查看一个相当简单的类,它使用一个定义带注释的接收器类型的方法:
class Foo<T> {
void foo(Foo<@Bar T> this) {}
}
我现在想访问接收器类型参数@Bar
上的类型注释,但Java反射API在访问接收器时返回带注释的原始类型:
assert Foo.class.getDeclaredMethod("foo")
.getAnnotatedReceiverType()
instanceof AnnotatedParameterizedType;
断言失败,因为返回的带注释的类型将作为原始类型Foo
返回。这是故意的吗?在访问返回的@Bar
实现的私有属性时,我仍然可以找到AnnotatedType
注释。
我正在运行最新版本的Java 8。
答案 0 :(得分:8)
这是一个已知错误JDK-8058220。然而,问题似乎更深入。
如果不更改类文件格式和相应的规范更新,则无法轻松修复。目前,类文件不包含区分接收器参数和常规参数所需的信息(参见JDK-8062582)。
答案 1 :(得分:0)
原来这是一个简单的错误。我首先想到的是,这是链接问题的含义,但类型注释与此无关。在Java运行时的当前实现中,类型注释测试不佳。深入探讨此事时,我发现了一大堆问题:
答案 2 :(得分:-1)
如果我这样做:
Foo<Integer> f = new Foo<>();
Method m = f.getClass().getDeclaredMethod("foo");
AnnotatedType at = m.getAnnotatedReceiverType();
for (Annotation a:at.getAnnotations()) {
System.out.println("Annotation: "+a);
}
然后我将注释放在接收器类型上,如下所示:
public void foo(@Bar(1) Foo<T> this) {}
现在您可以访问@Bar(1)注释。请注意,我将注释直接放在ReceiverParameter上,而不是它的Type参数。
我知道现在这只是一个部分答案......但我想从某个地方开始。其他人可能会添加并提供完整的答案,或者随着时间的推移我会学到更多......接收器类型和注释的使用对我来说都是新的,并且没有太多的文档和样本可供使用。
我怀疑是无法访问此信息。另请参阅the answer an another topic:
关于注释,关于从方法参数中的类型参数获取注释,没有办法给出上述内容。
同一主题将向您展示如何在字段中访问类型参数的注释。