根據http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29,Class.getDeclaredMethods()應該只包含「由類聲明」的方法。但是,我得到了一些非常令人驚訝的結果與下面的測試代碼:看起來很奇怪/令我感到詫異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規定(p.23 langspec-3.0.pdf)。但我很好奇,爲什麼這個限制需要適用於靜態方法。我的理解是,靜態方法可以被隱藏並且不會被覆蓋,並且引用在編譯時被解析,所以這個限制背後的推理是什麼?
兩個m2()方法包含在輸出中。這似乎與getDeclaredMethods()僅返回「由類聲明」方法和「排除繼承方法」的說法相矛盾。我沒有看到A.m2()爲「由B聲明」。
一個m1()包含在輸出中。繼上一點之後,如果讓getDeclaredMethods()返回兩個m2(),爲什麼它不返回兩個m1()呢?畢竟他們是兩種截然不同的方法,一種被另一種隱藏。除了在m1()的情況下返回類型相同之外,我沒有看到m1()和m2()的情況之間的任何差異,但是我知道返回類型不是方法簽名的一部分嗎?
在此先感謝!
對我來說,一個'm2'包含在輸出(jdk_1.6.0_21)中。 – axtavt 2010-11-04 12:58:17
我有兩個使用jdk_1.6.0u18的m2()。那麼這個東西在u18和u21之間是固定的嗎?如果是這樣的話,是否有固定的票證? thx – RAY 2010-11-05 01:41:48