2010-11-04 69 views
7

根據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()的情況之間的任何差異,但是我知道返回類型不是方法簽名的一部分嗎?

在此先感謝!

+0

對我來說,一個'm2'包含在輸出(jdk_1.6.0_21)中。 – axtavt 2010-11-04 12:58:17

+0

我有兩個使用jdk_1.6.0u18的m2()。那麼這個東西在u18和u21之間是固定的嗎?如果是這樣的話,是否有固定的票證? thx – RAY 2010-11-05 01:41:48

回答

2

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

雖然已經報警對1.6.0_12-B04上2009-03-11 05:44:57.0 但是Sun接受它2010-07-22 01:25:56.0

在簡要:

梗概(反映)Class.getDeclaredMethods()被返回的繼承方法

類別的java:classes_lang

報道反對

國家 3-接受,錯誤

優先級: 3 - 中

提交日期 11-MAR-2009

解決辦法 N/A

評估將進行調查。

發佈日期: 2010-07-22 01:25:56。0

+0

「將調查」... ... – RAY 2010-11-05 06:48:28

+0

:D它是或Acle效果! – 2010-11-05 06:57:18