tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Collinwood
  • 1 Beitrag von Collinwood
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
722
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    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,
    DEV
    Geändert von DEV (06.12.10 um 09:53 Uhr) Grund: Vertipper / Schreibfehler: Angesprochene Methode "addMA" heißt "addData"
     

  2. #2
    Collinwood Collinwood ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    35789 Weilmünster (Hessen)
    Beiträge
    28
    Hallo DEV,

    zeig doch bitte mal die addMA-Methode.
     

  3. #3
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    Hallo,

    danke für die Antwort und sorry, Vertipper, sollte natürlich die angehängte addData sein statt addMA.

    Gruß
    DEV
     

  4. #4
    Collinwood Collinwood ist offline Mitglied Bronze
    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
    Code :
    1
    
    Method m = this.getClass().getDeclaredMethod("set"+renderer.RENDERER, new Class[] {Object.class});
    statt
    Code :
    1
    
    Method m = this.getClass().getDeclaredMethod("set"+renderer.RENDERER, new Class[] {Integer.class});
    probierst, also den Upper Bound angibst.
    Jedoch: Keine Garantie!
    Für weitere Fragen gerne verfügbar.
    Gruß
     

  5. #5
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    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
     

  6. #6
    Collinwood Collinwood ist offline Mitglied Bronze
    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....!
     

  7. #7
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    Hallo,

    danke. Hab alles versucht, kommt immer der gleiche Fehler. Irgendwie scheint hier Reflection die Vererbung nicht zu kapieren.
     

  8. #8
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    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
     

  9. #9
    Collinwood Collinwood ist offline Mitglied Bronze
    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
    DEV bedankt sich. 

  10. #10
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    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
     

  11. #11
    Collinwood Collinwood ist offline Mitglied Bronze
    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"!
    DEV bedankt sich. 

  12. #12
    Collinwood Collinwood ist offline Mitglied Bronze
    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
     

  13. #13
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    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

  1. Reflection
    Von Maik20 im Forum Java
    Antworten: 3
    Letzter Beitrag: 06.12.10, 13:06
  2. (SWT) DND + Reflection
    Von Tobias Köhler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 23.07.09, 12:12
  3. How to Reflection
    Von Lord_Aratorn im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 01.12.08, 17:57
  4. Reflection(C#)
    Von wae20 im Forum .NET Café
    Antworten: 9
    Letzter Beitrag: 07.05.08, 11:38
  5. Reflection
    Von Herli im Forum Java
    Antworten: 2
    Letzter Beitrag: 11.11.04, 14:09

Stichworte