代码之家  ›  专栏  ›  技术社区  ›  Rafael Winterhalter

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

  •  18
  • Rafael Winterhalter  · 技术社区  · 10 年前

    我在看一个相当普通的类,它有一个定义了带注释的 接收器类型 :

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

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

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

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

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

    3 回复  |  直到 10 年前
        1
  •  10
  •   apangin    10 年前

    这是一个已知的错误 JDK-8058220 然而,问题可能比看起来更深。

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

        3
  •  -1
  •   Community Mohan Dere    9 年前

    如果我运行这个:

    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 :

    至于注释,关于从方法参数中的类型参数获取注释,上面没有给出任何方法。

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

    推荐文章