根据http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29, Class.getDeclaredMethods() 应该只包括方法“由类声明”。但是,使用下面的测试代码,我得到了一些非常令人惊讶的结果:
import java.util.Arrays;
class A {
public static A m1() { return null; }
public static A m2() { return null; }
public static A m3() { return null; }
}
class B extends A {
public static A m1() { return null; }
public static B m2() { return null; }
// public static Object m3() { return null; } won't compile
}
public class Scratch {
public static void main(final String[] args) {
System.out.println(Arrays.asList(B.class.getDeclaredMethods()));
}
}
一些对我来说看起来很奇怪/令人惊讶的事情:
编译器抱怨 B.m3() 的返回类型与 A.m3() 不兼容。这是由 JSL 8.4.8.3(第 225 页 v3 langspec-3.0.pdf)规定的。但我很好奇,为什么这个限制需要应用于静态方法。我的理解是静态方法可以隐藏不被覆盖,并且引用是在编译时解析的,那么这个限制背后的原因是什么?
输出中包含两个 m2() 方法。这似乎与 getDeclaredMethods() 仅返回“由类声明的”方法和“排除继承的方法”的说法相矛盾。我不认为 A.m2() 是“由”B“声明的”。
输出中包含一个 m1()。继上一点之后,如果让 getDeclaredMethods() 返回两个 m2() 有意义,那么为什么它不返回两个 m1() 呢?它们毕竟是两种不同的方法,一种被另一种隐藏。我没有看到 m1() 和 m2() 的情况之间有任何根本区别,除了在 m1() 的情况下返回类型相同,但我理解的返回类型不是方法签名的一部分?
提前致谢!