Java 如何访问接收器类型';s参数

Java 如何访问接收器类型';s参数,java,java-8,receiver,type-annotation,Java,Java 8,Receiver,Type Annotation,我看到的是一个相当简单的类,它有一个定义带注释接收器类型的方法: 断言失败,因为返回的带注释类型作为原始类型Foo返回。这是故意的吗?在访问返回的AnnotatedType实现的私有属性时,我仍然可以找到@Bar注释 我正在运行Java 8的最新版本。如果我运行此版本: Foo<Integer> f = new Foo<>(); Method m = f.getClass().getDeclaredMethod("foo"); AnnotatedType at = m.g

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

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

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

如果我运行此版本:

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);
}
Foo f=new Foo();
方法m=f.getClass().getDeclaredMethod(“foo”);
AnnotatedType at=m.getAnnotatedReceiverType();
对于(注释a:at.getAnnotations()){
System.out.println(“注释:+a”);
}
然后我将注释放在接收器类型上,如下所示:

  public void foo(@Bar(1) Foo<T> this) {}
public void foo(@Bar(1)foo this){
现在您可以访问@Bar(1)注释。注意,我将注释直接放在ReceiverParameter上,而不是您想要的类型参数上

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

我的怀疑是根本没有办法获取这些信息。另见:

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

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

这是一个已知的错误。然而,问题似乎更为严重


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

结果表明这是一个简单的错误。我首先认为,这是关联问题的一种暗示,但类型注释与此无关。在Java运行时的当前实现中,类型注释测试得很差。深入调查此事时,我发现了大量问题:


我已经可以访问类型本身的注释,但不能访问注释类型的参数。您的建议也适用于原始类型。
实例从不表示泛型类型,为了调用
getDeclaredMethod
,您总是需要遍历其中一个实例。是的,我发现它适用于原始类型,并且必须修改我的答案,正如我最初所说的,这是问题的一部分,但事实并非如此。这真的是令人困惑和复杂,我怀疑我只是不明白应该如何使用它。我认为这真的很有趣,而且还没有得到真正的回答。您可以看到一个关于如何获得
注释参数化类型的示例,但我不太确定如何获得注释。听起来您好像在说您正在访问底层实现的私有字段。出于好奇,你能告诉我你会怎么做吗?我应该试试的。我认为这是由返回错误的类型表示引起的,但正如现在接受的答案所述,这显然是一个错误。这一切都非常有趣,并表明合成/强制参数存在问题。然而,我看不出这与最初的问题有什么关系。使用示例代码,我完全能够访问接收器参数上的类型注释。我的理解方式是,问题是我们应该如何访问放置在接收方参数类型的类型参数中的注释
foo(foo-this)
vs
foo(@Bar-foo-this)
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) {}