2010-11-04 11 views
7

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!

+0

Für mich ist ein 'm2' in der Ausgabe enthalten (jdk_1.6.0_21). – axtavt

+0

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

Antwort

2

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

Obwohl 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:

Synopsis (reflektieren) Class.getDeclaredMethods() wird geerbten Methoden Rückkehr

Kategorie java: classes_lang

Berichtet gegen

Staat 3-Akzeptiert, Fehler

Priorität: 3-Medium

Senden Datum 11-MAR-2009

Arbeiten um N/A

Bewertung Wird untersucht.

Datum der Veröffentlichung: 2010-07-22 01:25:56.0

+0

"Wird untersuchen" ... – RAY

+0

: D Es ist Or-Acle-Effekt! –

Verwandte Themen