Laut http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 sollte Class.getDeclaredMethods() nur Methoden "von der Klasse deklariert" enthalten. Allerdings bin ich ein paar ziemlich überraschende Ergebnisse mit dem Testcode immer unter:getDeclaredMethods() und versteckte Superklasse statische Methode
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/raschend für mich aussehen:
Der Compiler beschweren sich über B.m3() einen inkompatiblen Rückgabetyp mit A.m3() haben. Dies wird von JSL 8.4.8.3 (Seite 225 v3 langspec-3.0.pdf) diktiert. Aber ich bin neugierig, warum diese Einschränkung für statische Methoden gelten soll. Ich verstehe, dass statische Methoden versteckt und nicht überschrieben werden können, und dass die Referenz zur Kompilierungszeit aufgelöst wird. Was ist also der Grund für diese Einschränkung?
Zwei m2() -Methoden sind in der Ausgabe enthalten. Dies scheint der Behauptung zu widersprechen, dass getDeclaredMethods() nur Methoden zurückgibt, die "von der Klasse deklariert sind" und "vererbte Methoden ausschließt". Ich sehe A.m2() nicht als "deklariert von" B.
Ein m1() ist in der Ausgabe enthalten. Wenn es nach dem vorherigen Punkt sinnvoll ist, getDeclaredMethods() zwei m2() zurückgeben zu lassen, warum gibt es dann nicht auch zwei m1() zurück? Sie sind nach zwei verschiedenen Methoden, und die eine ist von der anderen versteckt. Ich sehe keinen prinzipiellen Unterschied zwischen dem Fall von m1() und m2(), außer dass der Rückgabetyp im Fall von m1() der gleiche ist, aber der Rückgabetyp, wie ich es verstehe, nicht Teil der Methodensignatur ist?
Vielen Dank im Voraus!
Für mich ist ein 'm2' in der Ausgabe enthalten (jdk_1.6.0_21). – axtavt
Ich habe zwei m2() mit jdk_1.6.0u18. Ist das etwas zwischen U18 und U21? Gab es ein festes Ticket dafür, wenn das der Fall ist? thx – RAY