如何访问接收器类型参数的类型注释

时间:2016-01-01 22:45:52

标签: java java-8 receiver type-annotation

我正在查看一个相当简单的类,它使用一个定义带注释的接收器类型的方法:

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。

3 个答案:

答案 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

  

关于注释,关于从方法参数中的类型参数获取注释,没有办法给出上述内容。

同一主题将向您展示如何在字段中访问类型参数的注释。