Reflections (invoke-Methode)

Status
Nicht offen für weitere Antworten.

sutcha

Bekanntes Mitglied
Hallo,

ich habe ein Methode, die (mit einem Klassennamen als Parameter) aufgerufen wird und mit Hilfe des Klassennamen auf ein entsprechendes DAO zugreift, dort eine FindAll-Methode aufruft und die erhaltene Liste dann schließlich zurückgibt.

Zum Code:

Java:
public List<Category> getAll(String classname) {
		List<Category> list = new ArrayList<Category>();
		Method getAll = null;
		Class<?> dao = getDaoByClassname(classname); 
		try {
			getAll = dao.getMethod("findAll");
			list = (List<Category>) getAll.invoke(dao);  
			// Was wird bei der Methode invoke als Parameter angegeben? 
			//Also in meinem konkreten Fall? dao mag er nicht

		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}


private Class<?> getDaoByClassname(String classname) {
		Class<? extends CategoryService> service = this.getClass();
		Class<?> dao = null;
		String daoName = "";
		Field daoField = null;
		daoName = firstLetterToLowerCase(classname + "DAO"); 
		// Konvention für die DAO-Felder in der Service-Klasse
		try {
			daoField = service.getDeclaredField(daoName);
			dao = daoField.getType();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return dao;
	}

Momentan hänge ich an der invoke-Methode, da ich nicht weiß, welches Objekt ich übergeben soll. Habe relativ wenig Erfahrung mit Reflections....

Hoffe ihr könnt mir helfen und versteht mein Problem!
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> dao mag er nicht

genauer geht's nicht? Fehlermeldung?
wenn die Methode nicht statisch ist, musst du ein Objekt der Klasse übergeben

> list = (List<Category>) getAll.invoke(dao);

ein generischer Cast ist übrigens generell unmöglich/ überflüssig:
list = (List) getAll.invoke(dao);
 

sutcha

Bekanntes Mitglied
ok, ich habe es gerade spezifiziert... bei der Verwendung von "dao" kommt: object is not an instance of declaring class

Ich kann aber keine neue Instanz erzeugen, da ich bei den DAOs die vom Framework verwalteten Instanzen benötige.
 
S

SlaterB

Gast
dieses dein Problem kann aber Reflection nicht für dich lösen,
Reflection kann mit Klassen und deren Methoden hantieren, nicht aber Objekte von irgendwelchen Stellen im Framework herzaubern,
zumindest nicht ohne exakte Anleitung
 

sutcha

Bekanntes Mitglied
Reflection kann mit Klassen und deren Methoden hantieren, nicht aber Objekte von irgendwelchen Stellen im Framework herzaubern
das ist mir schon klar ;)

diese ganzen Methoden sind in einem Service definiert, der die DAOs injiziert bekommt. Zur Laufzeit hat der Service also auch die Referenz zu den DAO-Instanzen und über diese Referenzen möchte ich zugreifen. Ist das nicht möglich?
 
S

SlaterB

Gast
ansonsten ist alles möglich, vielleicht muss eine get-Methode der eigenen Klasse passend zum Klassenname aufgerufen werden,
aber wie soll das jemand erraten?

edit:
nanu, macht nicht
> getDaoByClassname(String classname) {
genau das, was noch fehlt?

edit2:
ok, da holst du bisher nur die Klasse, aber doch genauso auch das Dao-Objekt?
 
Zuletzt bearbeitet von einem Moderator:

sutcha

Bekanntes Mitglied
was gibt es für eine Alternative? ich lese aus einer Tabelle die Tabellennamen bestimmter Kategorien aus, generiere die Mappings und DAOs und verwende in dem Service Reflections, da ich ja bereits über die Tabellennamen auch die Namen der DAOs und deren Entitys kenne. Ist da Reflections so falsch?

Bzw.: wie kann ich sonst auf bestimmte Datenelemente zugreifen, deren Namen ich erst zur Laufzeit kenne?


@SlaterB:

ich hole mir nur die Klasse, aber nicht das konkrete Objekt, glaube ich. Ich müsste die Methode über das Field bekommen, dann würde es gehen. Richtig?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
siehe auch edits in meinem letzten Post,

wenn man mal annimmt, dass der Schritt von DB-Klassenname zum DAO-Objekt unumgänglich ist,
dann solltest du wenigstens nur das Objekt so umständlich laden, und findAll() dann ganz normal aufrufen:

AnyDao dao = getDaoObject(name);
dao.findAll();

falls es noch kein gemeinsames Interface für alle diese Klassen gibt, dann hurtig definieren
 

sutcha

Bekanntes Mitglied
hm, das ist nicht besonders einfach mit dem Interface für die DAOs. Es existiert bereits ein generisches Interface, was für jedes DAO mit Angabe der Entity und der Id erweitert wird. Daher werden die Objekte immer mit einem anderen Interface zurückgegeben... d.h. ich habe verschiedene Kategorien, die jeweils ein Interface besitzen und kein gemeinsames.

An das konkrete Objekt komme ich nur über die Field-Methode oder? Wie kann ich über dieses Field auf eine weitere Methode zugreifen?

Vielen Dank für deine Hilfe!
 
S

SlaterB

Gast
so wie bisher?!

eine Klasse darf übrigens mehrere Interface implementieren,
wenn alle deine Klassen findAll als Methode haben, wo ist das Problem?

nur für eine Methode macht ein neues Interface allerdings evtl. begrenzt Sinn,
das könnte mehr Arbeit machen als sparen, vielleicht aber auch nicht
 

sutcha

Bekanntes Mitglied
es geht darum, dass ich ja alle Methoden ins Interface packe, auf die ich zugreifen möchte. Diese geben aber in jeder Klasse, die das Interface implementiert, ein anderen Typ zurück. Diese Objekte (Entity!) implementieren zwar ihrerseits ein Interface, was jedoch in den DAOs nicht verwendet wird, da es lediglich ein Marker ist und die DAOs alle den gleichen Ursprung haben (auch für Klassen ohne Marker)

So wie ich es bisher gemacht habe, bekomm ich doch nur die Klasse und nicht die Instanz, mit der ich arbeiten will. Oder seh ich das falsch?
 
S

SlaterB

Gast
> dao = daoField.getType();
liefert den Typ

dao = daoField.get(service);
oder so das Objekt
 

sutcha

Bekanntes Mitglied
Vielen Dank! da war ich wohl die ganze Zeit blind... ich hab die Methode "get(Object obj)" in der API einfach übersehen... Werde es morgen gleich alles testen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Java Reflections Allgemeine Java-Themen 6
T Diskussion - Reflections Allgemeine Java-Themen 21
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
hdi Zu Reflections & Annotations Allgemeine Java-Themen 10
M Typ einer inneren Klasse mit reflections finden Allgemeine Java-Themen 7
T Klasse mit Reflections adden Allgemeine Java-Themen 3
K Reflections Fragen Allgemeine Java-Themen 7
hdi Dynamisches Instantiieren (Reflections) Allgemeine Java-Themen 4
G Typ Parameter & Reflections Allgemeine Java-Themen 4
Nils_Langner Wo bin ich gerade? Reflections Allgemeine Java-Themen 3
S Reflections und inherited Fields Allgemeine Java-Themen 4
S Reflections und final Allgemeine Java-Themen 19
N Reflections mit Unter- und Oberklasse Allgemeine Java-Themen 2
F Reflections Allgemeine Java-Themen 6
S Auf statische Funktionen mit Java Reflections zugreifen Allgemeine Java-Themen 3
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
H Unterschied EventQueue.invoke... und thread.start() Allgemeine Java-Themen 4
faetzminator IllegalArgumentException bei Method.invoke() Allgemeine Java-Themen 6
S Active-X Call / Invoke?` Allgemeine Java-Themen 7
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
kenny1987 Frage zu getMethod und invoke Allgemeine Java-Themen 9
P invoke per button Allgemeine Java-Themen 5
T invoke() einer Methode - Probleme mit Rückgabewert Allgemeine Java-Themen 5
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben