如何访问接收方类型参数上的类型批注

2022-09-02 22:27:42

我正在研究一个相当平凡的类,其中包含定义带注释的接收器类型的单个方法:

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

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

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

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

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


答案 1

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

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


答案 2

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


推荐