重写方法上的Java Class.getMethods()行为

在Java中使用reflection编写一个简单的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() ,但其余两个分别对应于具有返回类型A的原始x()和具有返回类型Bx()的覆盖版本。 这让我感到有些奇怪,但由于无法从任何地方访问,因此数组中的原始x() 。 无论如何我的问题是:
有没有简单的方法来获取类的方法的最专业版本的列表,而无需手动检查重写方法并过滤掉它们?

我的理解是,如果你过滤掉isBridge()返回true的方法,那么不需要的方法就会消失。

它是Java如何实现协变返回类型的一个人工制品(桥接方法也用于generics,但这似乎与您的用例无关)。

编辑有趣的是,虽然这适用于类,但它似乎不适用于接口。 B所有三种方法都标记为非桥和非合成。 但是,如果我创建一个实现B的非抽象类C ,它的A x()被标记为桥和合成。

你所拥有的是“协变回归”。

正如aix指出的那样,你似乎必须处理桥接方法。 阅读本文: http : //stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html(忽略有关generics的文本)和此: GetDeclaredMethods(java)中的问题

一种方法是说: B.class.getDeclaredMethods() ,但是,这将只返回B中解析的方法。所以,如果你有C扩展B实现A, C.class.getDeclaredMethods()不会返回你的方法没有被覆盖。

如果你想迭代,那么这样做的好方法是

 for (Method m: B.class.getMethods()) { if (m.getDeclaringClass() == Object.class || m.declaringClass() == A.class) continue; // otherwise do some stuff }