问题标签 [java-bridge-method]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
226 浏览

java - 反射 - Method::getGenericReturnType 没有泛型 - 可见性

描述

我有一个奇怪的问题,即Method::getGenericReturnType()无法检索泛型类型信息。

这是最小化版本:

输出是

没有任何通用类型信息。这对我来说似乎很奇怪。

但是,将As 可见性更改为public并正确给出


问题

我不知道这是一个错误还是实际预期的行为。如果是预期的,其背后的原因是什么?

我正在使用来自 AdoptOpenJDK 的 OpenJDK 15:

朋友也可以复制它:

  • JDK祖鲁8
  • 采用OpenJDK 10、11、14

发现

A我做了很多实验,发现和之间唯一的可见性组合B触发了这个问题是 when BispublicAis not public。任何其他组合,它都会再次按预期工作。所以只有

  • public,甲protected
  • public,甲package-visible
  • public,甲private

表现出奇怪的行为。

我尝试在不同的文件中移动代码,将其放入不同的包中,static在这里和那里添加或删除,没有任何改变。

我还检查了该方法的源代码,即

wheregetGenericSignature()依赖于在实例String signature构造过程中设置的a。Method在上述情况下似乎是null出于某种原因。


更新 1

我只是在检查类的字节码,并在以下位置找到了这个B.class

B在我看来,出于某种原因,这看起来像是创建了另一个方法foo(),该方法只是将方法调用转发给As foo(),因此没有泛型类型信息。

而且,调用B.getDeclaredMethods()它实际上返回一个方法,即

即使此方法应该排除继承的方法(来自文档):

返回一个包含 Method 对象的数组,该对象反映此 Class 对象表示的类或接口的所有声明方法,包括公共、受保护、默认(包)访问和私有方法,但不包括继承方法

B如果真的创建了一个包装方法,那么现在这将是有意义的。

但是,它为什么要创建这样的方法?是否有解释此行为的 JLS 部分?