17

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

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。

4

3 回答 3

9

这是一个已知的错误JDK-8058220。然而,问题似乎更深层次。

如果不更改类文件格式和相应的规范更新,就无法轻松修复它。目前,类文件不包含区分接收器参数和常规参数所需的信息(参见JDK-8062582)。

于 2016-01-06T12:06:19.987 回答
0

原来这是一个简单的错误。我首先想到的是,这是链接问题的隐含,但类型注释与此无关。在 Java 运行时的当前实现中,类型注释的测试很差。在深入研究此事时,我发现了很多问题:

于 2016-01-12T15:31:15.640 回答
-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 上,而不是您想要的类型参数。

我知道这只是现在的一部分答案……但我想从某个地方开始。其他人可能会添加并提供完整的答案,或者随着时间的推移我会学到更多......接收器类型和注释的这种使用对我来说都是非常新的,没有太多的文档和示例可供参考。

我的怀疑是没有办法访问这些信息。另请参阅另一个主题的答案

至于评论,关于从方法参数中的类型参数获取注释,上面没有办法。

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

于 2016-01-06T02:37:08.363 回答