[英]getDeclaredMethods() and hidden super class static method
根據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()的情況下返回類型是相同的,但是我理解的返回類型不是方法簽名的一部分?
提前致謝!
我可以確認http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786中的錯誤仍然存在於Oracle Java Windows 64位1.6.0_35中。
請參見http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786
雖然在2009-03-11 05:44:57.0報告了1.6.0_12-b04但是Sun在2010-07-22 01:25:56.0接受了它
簡單來說:
概要 (反射)Class.getDeclaredMethods()返回繼承的方法
類別 java:classes_lang
報道反對
State 3-Accepted,bug
優先級: 3 - 中等
提交日期 2009年3月11日
解決 N / A問題
評估將調查。
發表日期: 2010-07-22 01:25:56.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.