在使用 Java 反射编写一个简单的 JSON 序列化程序时,我对 Class.getMethods() 的行为感到措手不及。如果重写方法的返回类型扩展了被重写方法的返回类型,则 Java Class.getMethods() 似乎会返回重写方法和被重写方法。
例如给定接口:
static interface A {
A x();
A y();
}
static interface B extends A {
B x();
A y();
}
A.class.getMethods()
按预期返回和两个方法的数组
然而B.class.getMethods()
返回一个包含 3 个方法的数组(对我来说这有点违反直觉)。
3 个中,1 对应于y()
正如预期的那样,但剩下的两个对应于原来的x()
带返回类型A
和最重要的版本x()
带返回类型B
分别。这让我觉得有点奇怪,但原来的x()
在数组中,因为它无法从任何地方访问。不管怎样,我的问题是这样的:
是否有一种简单的方法可以获取类方法的最专业版本的列表,而无需手动检查覆盖的方法并将其过滤掉?
我的理解是,如果你过滤掉以下方法isBridge()
回报true
,不需要的方法应该消失。
它是 Java 如何实现协变返回类型的产物(桥接方法也用于泛型,但这似乎与您的用例无关)。
edit有趣的是,虽然这适用于类,但它似乎不适用于接口。全部三种方法B
被标记为非桥接和非合成。但是,如果我创建一个非抽象类C
实施B
, its A x()
被标记为桥接和合成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)