2Danke
ERLEDIGT
JA
JA
ANTWORTEN
12
12
ZUGRIFFE
722
722
EMPFEHLEN
-
Hallo,
hab hier ein komisches Problem, das ich nicht verstehe. Gegeben ist folgender Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public class CombinedChart extends Chart { private JPanel PANEL = new JPanel(); private TreeMap<Integer, ChartModel> CHARTS = new TreeMap<Integer, ChartModel>(); public CombinedChart(Chart chart) { this(chart, 1); } public CombinedChart(Chart chart, int weight) { super(); ..... } }
und
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
public class Chart extends ChartPanel { public Integer addData(...) { ..... try { Method m = this.getClass().getDeclaredMethod("set"+renderer.RENDERER, new Class[] {Integer.class}); m.invoke(this, index); } catch(Exception ex) { Main.MSG("Chart::addData:catch("+ex.getLocalizedMessage()+")", Main.MSG_ERROR); } tuneChart(); return index; } }
Der Code ist natürlich hier stark gekürzt. Folgendes Problem tritt auf: Wenn ich ein Objekt CombinedChart habe und (über Umwege) in die Methode "addData" laufe, bricht mir das Programm im try/catch-Block ab mit nur folgender Meldung:
charts.basic.CombinedChart.setXYLineAndShapeRenderer(java.lang.Integer)
Die Methode gibt es in Klasse "Chart", allerdings nicht in Klasse "CombinedChart". Da aber die Klasse von "Chart" erbt, müsste das doch problemlos laufen, oder nicht? Der Abbruch passiert bei "m.invoke", es gibt die Methode die ausgeführt werden sollte und es sind alle Variablen korrekt belegt. Wenn ich die Methode, die per Reflection aufgerufen werden sollte manuell ausführe (this.xxxx), dann geht das astrein; scheinbar liegt das Problem irgendwo bei der Reflection.
Kann mir hier jemand einen Tipp geben? Bin jetzt nicht unbedingt neu in Java, aber das verstehe ich nun überhaupt nicht. Leider fand ich zu dem Thema auch keine Infos bei Google.
Danke und Gruß
DEV
EDIT:
Habe nun testweise die Methode die nicht ausgeführt wird mal in die Klasse "CombinedChart" aufgenommen und leite weiter zu "super"; das geht, ist aber nicht Sinn und Zweck der Vererbung denk ich mal. Kann mir das jemand erklären wo hier der "Bug" ist?
Danke,
DEVGeändert von DEV (06.12.10 um 09:53 Uhr) Grund: Vertipper / Schreibfehler: Angesprochene Methode "addMA" heißt "addData"
-
06.12.10 09:43 #2
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Hallo DEV,
zeig doch bitte mal die addMA-Methode.
-
Hallo,
danke für die Antwort und sorry, Vertipper, sollte natürlich die angehängte addData sein statt addMA.
Gruß
DEV
-
06.12.10 10:21 #4
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Ah ok, sorry, hätte mir auffallen sollen wenn ich aufmerksam drübergeschaut hätte... my Fault.
Zum eigentlichen Problem:
Ich bin mir nicht ganz sicher ob es das ist, aber es kann beim Einholen von Informationen über Methoden manchmal passieren, dass ein Type Mismatch entsteht, wo er eigentlich nicht passieren sollte. Es gibt sicher Leute die können dir das "Warum" besser erklären, aber die Abhilfe KÖNNTE sein, wenn du
stattCode :1
Method m = this.getClass().getDeclaredMethod("set"+renderer.RENDERER, new Class[] {Object.class});
probierst, also den Upper Bound angibst.Code :1
Method m = this.getClass().getDeclaredMethod("set"+renderer.RENDERER, new Class[] {Integer.class});
Jedoch: Keine Garantie!
Für weitere Fragen gerne verfügbar.
Gruß
-
Hallo,
danke, hab das eben versucht, bekomme dann eine "NoSuchMethodException", was mir logisch erscheint, da es diese Methode mit "Object" als Parameter ja nicht gibt.
Aber die Idee war gut, hatte mich schon gefreut beim ausprobieren
-
06.12.10 11:30 #6
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
puh... äußerst schwierige Nuss. Also ich würde an der selben Stelle noch "int.class", alternativ "Integer.TYPE" ausprobieren, ansonsten bin ich da von meiner Seite her leider am Ende....!
-
Hallo,
danke. Hab alles versucht, kommt immer der gleiche Fehler. Irgendwie scheint hier Reflection die Vererbung nicht zu kapieren.
-
Nachtrag:
Habs wohl gelöst: Was hier nicht funktioniert ist die Methode "getDeclaredMethod". Warum das so ist verstehe ich nicht ganz. Habs getauscht durch "getMethod" und dann gings ohne Einschränkung. Wenn mir das noch jemand erklären kann, bin ich dankbar.
@Colinwood: Vielen Dank für deine Hilfe, dadurch bin ich auf die Lösung gestoßen.
EDIT: Wie kann man ein Thema als "gelöst" markieren?Geändert von DEV (06.12.10 um 12:06 Uhr) Grund: siehe @EDIT
-
06.12.10 12:13 #9
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Super!
Ich hab das währenddessen auch gefunden, hätte also den Methodenwechsel evtl. auch noch empfohlen, aber stark dass du es schon selbst gefunden hast. Dafür liefere ich dir jetzt den Unterschied der beiden Methoden nach:
Wenn wir englischsprachigen Ursprungs wären, wüssten wir beim Klingen des Worts "declared" wohl gleich, dass es im Sinne von Java ein Gegenteilwort zu "inherited" darstellt. Was nämlich im Endeffekt dazu führt, dass es zwei Methoden gibt, eine für sowohl vererbte, als auch deklarierte Methoden: getMethod(), und eine nur für deklarierte Methoden: getDeclaredMethod(). Und das erklärt dann wiederum, warum der ganze Spaß beim Vererben nicht funktioniert.
Zum Nachlesen: Java Reflection in Action
Viel Spaß beim weitercoden
-
Merci!
Was declared bedeutet (also die Übersetzung) war mir klar, leider aber nicht, dass das in Bezug auf die Klasse selbst anzuwenden ist, also Ausschluss der Vererbung. Muss man auch erst draufkommen
Kannst du mir noch sagen, wie man ein Thema als gelöst markieren kann?
Vielen Dank und Gruß
DEV
-
06.12.10 12:51 #11
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Da ist so ein Haken rechts neben dem länglich-ovalen Button wo "+ Auf Thema antworten" draufsteht. Das gibt es oben direkt unter der Navigation, oder unter dem letzten Beitrag. Nur der Themenersteller kann mit einem Klick darauf sagen: "Erledigt"!
-
06.12.10 13:16 #12
- Registriert seit
- Jul 2010
- Ort
- 35789 Weilmünster (Hessen)
- Beiträge
- 28
Noch ein Nachtrag:
Ich habe über den Grund grübeln müssen, warum es wohl zwei verschiedene Methoden für die gleiche Sache gibt, wenn damit nichts erreicht wird außer das die Anwender Fehler produzieren. An der Performance kanns wohl schon mal nicht liegen.
Eben bin ich dann drauf gekommen: Durch die Vererbung entsteht ja Möglichkeit des sog. "Override" und damit hat man sofort gleichnamige Methoden, mindestens eine vererbte und eine deklarierte ("überrittene"). Und um in diesem Fall die richtige zu bekommen, reicht getMethod() einfach nicht aus. Im umgekehrten Fall, wie bei dir, gibt es natürlich keine Override-Methode, und daher sucht getDeclaredMethod() vergeblich.
Wäre ich bei Sun, würde ich 3 aussagekräftige Methoden machen, à la "getInheritedMethod", "getOverrideMethod" und "getDeclaredMethod" und die "getMethod" als deprecated kennzeichnen.
Es wird ja immer irgendwas gefixt in neuen JDK-Versionen, vielleicht ist das ja beim nächsten mal dabei
-
Das ist eine gute Idee, solltest gleich mal bei SUN einreichen. Das wäre zumindest eine "deutliche" Beschreibung der Methoden bzw. wäre die Nutzung der jeweiligen Methode klarer, ohne sich stundenlang durch irgendwelche API-Dokus und Google zu wühlen

Was auch schon hilfreich gewesen wäre (also in meinem Fall), wenn die Fehlermeldung deutlicher wäre, aber das ist aus praktischer Sicht wohl unsinn.
Ähnliche Themen
-
Reflection
Von Maik20 im Forum JavaAntworten: 3Letzter Beitrag: 06.12.10, 13:06 -
(SWT) DND + Reflection
Von Tobias Köhler im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 23.07.09, 12:12 -
How to Reflection
Von Lord_Aratorn im Forum Java GrundlagenAntworten: 1Letzter Beitrag: 01.12.08, 17:57 -
Reflection(C#)
Von wae20 im Forum .NET CaféAntworten: 9Letzter Beitrag: 07.05.08, 11:38 -
Reflection
Von Herli im Forum JavaAntworten: 2Letzter Beitrag: 11.11.04, 14:09





Zitieren
Login





