reflection in inner classes

Mewel

Aktives Mitglied
Moin,

um mein Problem zu verdeutlichen habe ich mal ein kleines Beispiel geschrieben.

Java:
/** Hauptklasse um eine Hashtable mit verschiedenen Term-Klassen zu verwalten. */
public class Manager {

    private static Map<String, Class<? extends Term>> termList;

    static {
        termList = new Hashtable<String, Class<? extends Term>>();
        try {
            registerTerm(A.class);
        } catch(Exception exc) {
            exc.printStackTrace();
        }
    }

    public static void registerTerm(Class<? extends Term> termClass) throws NoSuchMethodException, InvocationTargetException,
            IllegalAccessException, InstantiationException {
        // seltsam aber ok, auch wenn ich es lieber mit newInstance machen würde
        Constructor<? extends Term> c = termClass.getConstructor(Manager.class);

        // find ich nicht schön das ich hier ne neue instanz von Manager anlegen muss
        termList.put(c.newInstance(new Manager()).getSomething(), termClass);
    }

    public abstract class Term {
        public abstract String getSomething();
    }

    private class A extends Term {
        // benötigt zwingend einen konstruktur, auch wenn ich ihn nicht will
        public A() {
        }

        @Override
        public String getSomething() {
            return "B";
        }
    }
}
Java:
/** Ein weiterer Term der sich beim Manager registrieren soll. */
public class B extends Term {

    public B() {
        // auch sehr komisches konstrukt, was anscheinend auch nicht
        // funktioniert
        new Manager().super();
    }

    @Override
    public String getSomething() {
        return "B";
    }

    public static void main(String args[]) throws Exception {
        Manager.registerTerm(B.class);
        
    }
}

Das erste offensichtliche Problem ist, das ich immer eine NoSuchMethodException für die Klasse B bekomme (Konstruktor haut nicht). Keine Ahnung woran das liegt oder wie ich das sonst schreiben soll.
Ein eher kosmetisches Problem ist, das ich immer eine Instanz des Managers benötige. Ist in meinen Augen aber gerade nicht der Sinn einer statischen Verwaltung von Class-Objekten.

Bin über jede Hilfe dankbar,
Mewel
 

tfa

Top Contributor
Das erste offensichtliche Problem ist, das ich immer eine NoSuchMethodException für die Klasse B bekomme (Konstruktor haut nicht). Keine Ahnung woran das liegt oder wie ich das sonst schreiben soll.
Die Klasse B hat keinen Konstruktor, der als Parameter ein Manager-Objekt fordert. Also kann er auch nicht gefunden bzw. aufgerufen werden.
 
S

SlaterB

Gast
die Klasse A auch nicht, das wird bei inneren Klassen dazugemogelt,
interessant, kannte ich noch nicht

> // benötigt zwingend einen konstruktur, auch wenn ich ihn nicht will

kann ich nicht bestätigen, bei mir gehts auch ohne, welche Fehlermeldung?

-----

ein neues Manager-Objekt brauchst du in A nicht, da kannst du überall, im Konstruktor und sonstwo,
Manager.this.xy();
schreiben

edit:
also das wird dann das Manager-Objekt sein, welches im Konstruktor übergeben wurde,
generell solltest du nur eines erstellen und das überall übergeben, ja,
das ist eine allgemeine Objektaufgabe, lege im einfachen Fall z.B. eines in einer statischen Variablen ab,
oder mache alles nicht-statisch in einem Manager-Objekt, dann this im Konstruktor übergeben

-------

HashMap statt Hashtable

----

bei der Klasse B genauso wie in A wenn sie innerhalb von Manager definiert ist,
außerhalb ist anscheinend überhaupt keine Klassendefinition möglich, die von Term innerhalb von Manager erbt

es sei denn die inneren Klassen werden alle als 'static' deklariert,
dann verschwindet die magische Verknüpfung mit dem umgebenden Manager-Objekt
 
Zuletzt bearbeitet von einem Moderator:

Mewel

Aktives Mitglied
Also wenn ich von A den Konstruktor wegmache bekomme ich:
java.lang.NoSuchMethodException: org.mycore.common.Manager$A.<init>(org.mycore.common.Manager)
at org.mycore.common.Manager.registerTerm(Manager.java:23)
----

Wenn ich dich richtig verstehe sollte ich in der Manager Klasse zusätzlich noch eine eigene Instanz verwalten? Quasi wie bei nem Singleton nur ohne privaten Konstruktor?

----

warum HashMap statt Hashtable?

----
Das ist genau der Punkt wo mein Problem liegt :). Klassen außerhalb der Manager-Klasse von Term ableiten zu lassen und sie trotzdem hinzufügen zu können. Das static Schlüsselwort bei Klassen ist auf jeden Fall interessant. Ich werde damit mal ein wenig rumspielen und schauen ob es mir was bringt.

Auf jeden Fall danke für deine Antwort
 
S

SlaterB

Gast
> Also wenn ich von A den Konstruktor wegmache bekomme ich: [Exception]

hast du noch einen zweiten Konstruktor mit Parametern definiert? dann bekomme ich auch die Exception wenn der DefaultKonstruktor fehlt,
wie auch immer, schreib ihn eben hin

> sollte ich in der Manager Klasse zusätzlich noch eine eigene Instanz verwalten? Quasi wie bei nem Singleton

was und wie du machst ist mir eher egal, nur zwei Aussagen:
1. in A brauchst du kein neues Manager-Objekt erstellen (wobei du das im ersten Post hauptsächlich in B gemacht hast),
Manager.this ist das im Reflection-Konstruktor übergebene Objekt
2. allen per registerTerm registierten Terms soll doch sicher dasselbe Manager-Objekt übergeben werden, mache das, wie auch immer (z.B. auch Manager als Parameter von registerTerm() )

> warum HashMap statt Hashtable?

das gebietet allein schon der saubere Name, HashMap ist eine Map,
bei Bedarf auch beide Begriffe zusammen in google eintippen

> Das static Schlüsselwort bei Klassen ist auf jeden Fall interessant.

genausogut könntest du dann Term außerhalb definieren, damit ist also nicht viel gewonnen,
außer eine neue .java-Datei eingespart (nur eine äußere public-Klasse pro Java-Datei)
 

Mewel

Aktives Mitglied
Ok, das static bringt in dem Zusammenhang wirklich nichts.

Ich war wohl bei der Namenswahl der Klassen etwas unglücklich. Die Manager-Klasse ist eigentlich kein Manager :). Es können schon mehrere Instanzen der Klasse existieren. Ist aber auch nicht so schlimm, da die Zugriffe innerhalb alle wunderbar funktionieren.

Das einzige Problem ist wie gesagt die Klasse B und deren Konstruktor.

Trotzdem nochmals vielen Dank

€ So funktionierts:
Java:
public class B extends Term {

    public B(Manager m) {
        m.super();
    }

    @Override
    public String getSomething() {
        return "B";
    }

    public static void main(String args[]) throws Exception {
        Manager.registerTerm(B.class);
        
    }
}
 
S

SlaterB

Gast
verrückt was es alles gibt, kompiliert bei mir auch,
hast du das nur durch Ausprobieren gefunden oder doch irgendwo in einer Anleitung?
 

Mewel

Aktives Mitglied
Hab mir im debug modus mit getConstructors die Konstruktoren angezeigt. Und da stand halt der Manager drin. Also hab ich mir gedacht pack ich den einfach mal als Konstruktor rein und da gings :).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I reflection get inner static classes Allgemeine Java-Themen 2
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben