getDeclaredMethods () und Super-Klasse statische Methode versteckt
-
28-09-2019 - |
Frage
Nach http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 , Class.getDeclaredMethods () sollte nur schließen Verfahren „, erklärte von die Klasse". Allerdings bin ich ein paar ziemlich überraschende Ergebnisse mit dem Testcode immer unter:
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()));
}
}
Ein paar Dinge, die ziemlich seltsam aussehen / raschend zu mir:
-
Der Compiler beschweren sich über B.m3 () eine inkompatible Rückgabetyp mit A.m3 mit (). Dies wird durch JSL 8.4.8.3 (Seite 225 v3 langspec-3.0.pdf) diktiert. Aber ich bin neugierig, warum diese Beschränkung auf statische Methoden anwenden muss. Mein Verständnis ist, dass statische Methoden versteckt werden kann und nicht außer Kraft gesetzt, und dass die Referenz bei der Kompilierung aufgelöst, so was ist der Grund für diese Einschränkung?
-
Zwei m2 () Methoden sind in der Ausgabe enthalten. Dies scheint die Behauptung widerlegen, dass getDeclaredMethods () nur kehrt Methoden „der Klasse deklariert“ und „schließt geerbten Methoden“. Ich sehe nicht, A.m2 () als B "durch erklärt".
-
Eine m1 () in der Ausgabe enthalten. Nach dem vorherigen Punkt, wenn es Sinn macht getDeclaredMethods () gibt zwei m2 () zu lassen, warum es nicht zurückgeben zwei m1 () als auch? Sie sind nach allen zwei verschiedene Methoden, und man wird von dem anderen versteckt. Ich sehe keinen fundemental Unterschied zwischen dem Fall von m1 () und m2 () mit Ausnahme der Art Rückkehr das gleiches im Fall von m1 () zu sein, aber der Rückgabetyp wie ich verstehe, ist nicht Teil der Signatur der Methode / p>
Vielen Dank im Voraus!
Lösung
Siehe http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 6815786
Auch wenn es gegen 1.6.0_12-b04 am 2009-03-11 05 gemeldet worden war: 44: 57.0 aber Sun nahm es auf 2010-07-22 01: 25: 56.0
in Kürze:
Überblick (reflektieren) Class.getDeclaredMethods () geerbten Methoden ist Zurückkehren
Kategorie java: classes_lang
Berichtet Vor
Staat 3-Akzeptiert, Fehler
Priorität: 3-Medium
Senden Datum 11-MAR-2009
Umgehen N / A
Evaluation wird untersucht.
Datum der Veröffentlichung: 2010-07-22 01: 25: 56.0
Andere Tipps
kann ich bestätigen, dass der Bug http://bugs.sun.com/ bugdatabase / view_bug.do? bug_id = 6815786 1.6.0_35 noch in Oracle Java Windows 64-Bit ist.