Problem in der GetDeclaredMethods (java)
Ich habe ein kleines problem in meinem code
Ich habe 2 Klassen
public class A {
public A foo(int a) {return new A();}
}
public class B extends A{
public B foo(int x){ return new B();}
}
nun in meinem code will ich drucken nur die Methode, die erklärt wurde, in der Klasse B
in dieser Weise
B b = new B();
Method[] m = b.getClass().getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
System.out.print(m[i].getName());
}
warum der Ausgang ist
foo
foo
warum die GetDeclaredMethods findet auch die foo in der Klasse A?
wie kann ich es beheben?
Dank
InformationsquelleAutor Dazel | 2009-12-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Sie ein problem ist, weil der kovariante Rückgabetypen der beiden Methoden. Da haben Sie eine kovariante Rückgabetyp (return-Typ von B ist B, nicht A, im Gegensatz zu den Oberklasse), Java unter der Haube erzeugt eine separate Methode mit dem ursprünglichen Rückgabetyp als eine Brücke zwischen den pre-1.5-bytecode-Spezifikation, die neue Java 1.5, Sprache, Verhalten.
Die Methode, die Sie verwenden sollten, um zu überprüfen, jedoch ist die
isBridge()
Methode, als es bringt genau das, was Sie Vorhaben auszuschließen. Also der Letzte code würde wie folgt Aussehen:im Grunde isBridge identifiziert Dinge, die getan werden, der Java-compiler, um zu passen ein Java-Sprachfeatures eingeführt durch Generika in bytecode Einschränkungen. isSynthetic sagt Ihnen, ob die Methode ist synthetisch erzeugt, die Brücke Methoden sind, aber mehr Dinge als gut, wie einige Elemente der inneren Klasse. So eine Brücke ist immer synthetisch, sondern ein synthetischer ist nicht immer eine Brücke. Denken Sie weiter, synthetische vielleicht, was, die Sie interessieren die meisten, die Methode existiert nicht in den source-code, Sie kümmern sich nicht, warum.
Schön, ich habe nie realisiert. Scheint, dass einige der Dinge, die Sie tun musste, um zu bekommen, Java-Arbeit mit dem 1,5-und-bis-Skillung sind... interessant.
Vielen DANK für dieses wissen, würde ich nie gefunden diese auf meinem eigenen. Ich bin versucht zu entlarven Java-Methoden in einer Sandbox-scripting-Sprache, und diese multi-Methode Diskrepanz war mich verrückt.
InformationsquelleAutor Yishai
Standardmäßig
getDeclaredMethods()
gibt alle Methoden der angegebenen Klasse, sowie Eltern, Klassen und Schnittstellen. Jedoch, dieMethod
- Objekt ermöglicht es Ihnen, zu testen, welche Klasse eineMethod
gehört durch den AufrufgetDeclaringClass()
auf, dassMethod
. Also, wenn Sie Durchlaufen alleMethod
Objekte, die Sie hinzufügen können, die Logik zu drucken nur eine Methode, wenn es gehört zu denB
Klasse.EDIT: Der obige code funktioniert nicht wie gewünscht-es gibt
B
als das deklarieren der Klasse von allen Methoden. DieisSynthetic()
Methode scheint zu funktionieren wie gewünscht, Rückgabe von true für eine überschriebene Methode (eine, die kam ausA
), aber falsch für eine, die kam ausB
. Also der folgende code könnte das sein, was du bist suchen für.Laß mich laufen, und sehen, was das problem ist...
Ich fand die Methode isSynthetic() return false für das original foo in der Klasse B und true zurückgeben, für die foo aus Klasse-A-aber, weil ich nicht vertraut mit der isSynthetic () - Methode ich bin nicht sicher, dass dies die richtige Nutzung von it. Ist dies der richtige Ort, um diese Methode zu verwenden?
getDeclaredMethods NICHT wieder die Methoden von übergeordneten Klassen oder interfaces, oder ist die javadoc falsch?
Je nachdem, welche Java-version 1.6, die Sie ausführen, erhalten Sie möglicherweise die geerbten Methoden zurückgegeben mit
getDeclaredMethods()
Finden Sie unter bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786InformationsquelleAutor Kaleb Brasee
Weil B. " foo " und " A. foo verschiedene Methoden. Wenn Sie möchten, überschreiben Methode A. foo, dann B-Methode foo muss wieder der Klasse A.
InformationsquelleAutor Denis Palnitsky
Können Sie anrufen m.getDeclaringClass (), um zu sehen, ob es die Methode aus Klasse A oder Klasse B.
InformationsquelleAutor Jim Ferrans
Dies kann funktionieren:
InformationsquelleAutor Tom Neyland
Wenn Sie sagt, wenn( ! aMethods.contains(m) ) nicht enthält, vergleichen Sie mit Namen? Argumente geben? Rückgabewert geben? da der einzige Unterschied für die gewünschte Methode an die nicht ist die Kovarianz zurück geben...
equals
).contains
verwenden Sie dieequals
Methode, und die Dokumentation vonMethod.equals
sagt: "... Gibt true zurück, wenn die Objekte gleich sind. Zwei Methoden sind die gleichen, wenn Sie deklariert wurden, von der gleichen Klasse und haben den gleichen Namen und die formalen parameter-und Rückgabetypen."InformationsquelleAutor T_lord