【问题标题】:How to access type annotations on a receiver type's parameters如何访问接收器类型参数的类型注释
【发布时间】:2016-01-01 22:45:52
【问题描述】:

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

class Foo<T> { 
  void foo(Foo<@Bar T> this) {}
}

我现在想访问接收器类型参数 @Bar 上的类型注释,但 Java 反射 API 在访问接收器时返回带注释的原始类型:

assert Foo.class.getDeclaredMethod("foo")
                .getAnnotatedReceiverType() 
  instanceof AnnotatedParameterizedType;

断言失败,因为返回的带注释的类型返回为原始类型Foo。这是故意的吗?在访问返回的AnnotatedType 实现的私有属性时,我仍然可以找到@Bar 注释。

我正在运行最新版本的 Java 8。

【问题讨论】:

  • 您可以查看here 的示例,了解如何获取AnnotatedParameterizedType,但我不太确定您将如何获得注释。听起来您是在说您正在访问底层实现的私有字段。只是出于好奇,您能否展示一下您将如何做到这一点?
  • 我应该尝试一下。我立即认为这是由返回错误的类型表示引起的,但正如现在接受的答案所述,这显然是一个错误。

标签: java java-8 receiver type-annotation


【解决方案1】:

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

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

【讨论】:

  • 这一切都很有趣,表明合成/强制参数存在问题。但是,我看不出这与原始问题有何关系。使用示例代码,我完全能够访问接收器参数上的类型注释。问题 - 我的理解方式 - 是我们应该如何访问放在接收器参数类型的类型参数中的注释。 foo(Foo&lt;@Bar T&gt; this)foo(@Bar Foo&lt;T&gt; this).
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果我运行这个:

    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);
    }
    

    然后我将注释放在 Receiver Type 上,如下所示:

      public void foo(@Bar(1) Foo<T> this) {}
    

    现在您可以访问@Bar(1) 注释。请注意,我将注解直接放在 ReceiverParameter 上,而不是您想要的 Type Parameter。

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

    我怀疑没有办法访问这些信息。另见the answer an another topic

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

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

    【讨论】:

    • 我已经可以访问类型本身的注释,但不能访问带注释类型的参数。您建议的内容也适用于原始类型。 Class 实例从不代表泛型类型,您始终需要遍历其中一个实例才能调用 getDeclaredMethod
    • 是的,我发现它适用于原始类型,并且必须修改我的答案,因为我最初表示这是问题的一部分,但事实并非如此。这确实令人困惑和复杂,我怀疑我只是看不到它应该如何使用。我认为这真的很有趣,但还没有真正得到回答。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多