簡體   English   中英

getDeclaredMethods()和隱藏的超類靜態方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM