在Java中使用反射编写一个简单的JSON序列化程序时,我对Class.getMethods()的行为感到措手不及.如果重写方法的返回类型扩展了重写方法的返回类型,则Java Class.getMethods()似乎返回重写和重写方法.
所以例如给定接口:
static interface A {
A x();
A y();
}
static interface B extends A {
B x();
A y();
}
Run Code Online (Sandbox Code Playgroud)
A.class.getMethods()返回和预期的两个方法B.class.getMethods()的数组然而返回一个3个方法的数组(这对我来说有点反直觉).在3中,1对应于y()预期,但其余两个分别对应于x()具有返回类型的原始A版本和x()具有返回类型的覆盖版本B.这让我感到有些奇怪,x()因为它不能从任何地方访问数组中的原始数据.无论如何,我的问题是:
有没有简单的方法来获取一个类的方法的最专业版本的列表,而无需手动检查重写方法并过滤掉它们?
我的理解是,如果你过滤掉isBridge()返回true的方法,那么不需要的方法就会消失.
它是Java如何实现协变返回类型的一个人工制品(桥接方法也用于泛型,但这似乎与您的用例无关).
编辑有趣的是,虽然这适用于类,但它似乎不适用于接口.所有这三种方法B都标记为非桥和非合成.但是,如果我创建一个非抽象类C实现B,它将A x()被标记为桥和合成.