Frage zum Thema Reflection

Status
Nicht offen für weitere Antworten.

F4llen4ngel

Aktives Mitglied
Cheers!

bastel jetzt schon den ganzen Tag rum - komm aber einfach nicht auf die Lösung meines Problems:

Ich habe einige verschiedene Klassen, die allesamt 3 gleiche Methoden besitzen welche sie von einer extra Klasse erben.
So weit so gut - nun erzeuge ich ein Objekt meiner Klasse "Mitarbeiter" in welcher wiederrum ein Objekt der Klasse
"Rolle" erzeugt wird ... immernoch alles kein Problem - bis jetzt:

An einer anderen Stelle in meinem Programm bin ich auf Reflection angewiesen um an die Inhalte einiger Variablen zu kommen -
funktioniert auch (fast) alles prima nur machen mir die 3 Methoden abgeleiteten Methoden sorgen. Warum? Ganz einfach:

Code:
Method lTempMethod = lO.getClass().getMethod("getId",null);
System.out.println(lTempMethod.invoke(this,null));

Die Methode "getID" ist eine der abgeleitten Klassen und ist in meiner Klasse Mitarbeiter z.B. mit dem Wert 1 und in der Klasse Rolle
z.B. mit dem Wert 3 belegt. Durch den Invoke Befehl bekomme ich allerdings nur 2x den Wert von Mitarbeiter zurückgeliefert, also dachte ic hich könnte statt
Code:
System.out.println(lTempMethod.invoke(this,null));
einfach
Code:
System.out.println(lTempMethod.invoke(Rolle,null));

oder dergleichen schreiben - dem war/ist abr nicht so!

Ich hoffe das war jetzt alles nicht zu :lol: - und ich hoffe das mir jemand erklären kann wie ich an die "Unterklasse" komme!

Gruß F4llen4ngel
 

Bleiglanz

Gesperrter Benutzer
da stimmt doch was nicht, wenn du die Methode korrekt überschrieben hast, dann nimmt Reflection schon die richtige?

Codebeispiel?

Ist der Parent abstrakt? Methoden final? oder sonstige schräge sachen??
 

thE_29

Top Contributor
tjo, das erste argument sagt mit welcher instanz der befehl ausgeführt wird!

ist es eine static funktion so kannst du dort null lassen!

schreibst du dort this rein, nimmt er dir deine Methode (eigentlich) und führt diese aus!

wenn du aber deine Rolle nimmst, sollte er die Methode von Rolle nehmen!

methoden finden is leicht, sie auszuführen hingegen eine knifflige sache ;)
 

F4llen4ngel

Aktives Mitglied
Ein Codebeispiel: Bitte sehr bitte gleich ... :D

Die Mutter aller Klassen:
Code:
public class BusinessObject {
    
   protected int mId;

	public int getId() {
		return mId;
	}
	
	public void setId(int pId) {
		mId = pId;
	}

public Map getAttribute{
		
		Map<String,String> lFeld = new HashMap<String,String>();
		
		for (Method lPublicMethod : this.getClass().getMethods()) {
			String lTemp = lPublicMethod.getName();
			if (lTemp.startsWith("get") && !lTemp.equals("getClass") && !lTemp.equals("getAttributeMitWertAsArray")) {
				
				try {
					Object lO = lPublicMethod.invoke(this,null);	
					if (lO instanceof Collection) {					
					} else if (lO instanceof String) {				
						lFeld.put(lTemp.replaceFirst("get","m").trim(),(String)lO);
					} else if (lO instanceof Integer) {				
						lFeld.put(lTemp.replaceAll("get","m").trim(),(String)String.valueOf(lO));
					} else if (lO instanceof Rolle) {
						[b]Method lTempMethod = lO.getClass().getMethod("getId",null);[/b]				
					}
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException 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();
				} catch (NoSuchMethodException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}				
					
			}	
		}
	return lFeld;
	}
}

Die Stelle die fett markiet funktioniert im Prinzip schon nicht da er mir die nicht die ID der Klasse Rolle sondern der Klasse Mitarbeiter anzeigt - die beiden Klassen sehen wie folgt aus:

Mitarbeiter:
Code:
public class Mitarbeiter extends BusinessObject {
	protected int mPerNr
	protected int mName
	.
	.
	.
	protected Rolle mRolle;

	public Mitarbeiter() {
		mRolle = new Rrolle();
	}
}

Rolle:
Code:
Klasse erbt von BusinessObject und hält noch eine Bezeichnung als String mit GET + SET Methode - Fertig!

Hoffe mir kann jemand weiterhelfen!
 

thE_29

Top Contributor
naja, ich seh grad das du 1.5 verwendest (eigentlich isses mir nur durch die for schleife aufgefallen, da die obrige anweisung mi <String... in C++ ja schon immer ging :))


aber das kann gar net gehn ;)

if (lTemp.startsWith("get") &&

weil die Methode niemals mit get anfängt ;)

hast du dir das schon jemals ausgeben lassen?

meistens fangen die an mit public deinpack

bsp.: public void at.dstore.cfbo.confBO.showOrNot()

sieht meine Funktion aus die eigentlich nur public showOrNot() heißt, also kann die niemals mit get oder so anfangen!


und auch bei dieser Zeile

Method lTempMethod = lO.getClass().getMethod("getId",null);


heißt die Funktion net getId!!


Kleiner tipp mit reflection, lass dir immer alls ausgeben, egal was du jetzt starten/holen (konstruktor,fkt oder variable) willst, du musst den genauen namen haben und der ist nie nur die Funktion ;)

hoffe dir mal ein bisi geholfen zu haben ;)
 

F4llen4ngel

Aktives Mitglied
daran kanns nicht liegen, da ich die Methodennamen richtig (!) zurückgeliefert bekomme.
Ansich funkioniert auch alles, ausser das ich auf die Werte der Klasse Rolle zugreifen kann
da diese in der Klasse Mitarbeiter erzeugt wird ...

Also wie gesagt - die Methoden komm mir richtigem Namen bei mir an und ich werte sie auch so aus das ich sie aufrufen kann - zumindest die in Klasse Mitarbeiter!
 

Bleiglanz

Gesperrter Benutzer
du willst wahrscheinlich alles, das du mit gettern bekommst in eine Hashmap legen?
Code:
            try {
               Object lO = lPublicMethod.invoke(this,null);   
               if (lO instanceof Collection) {               
// was soll der leere if Zweig an dieser Stelle
// bitte entfernen
               } else if (lO instanceof String) {            
               lFeld.put(lTemp.replaceFirst("get","m").trim(),(String)lO);

// IO ist doch schon das Ergebniss des Methodenaufrufs
// wenn getId einen String liefert, dann wandern wir doch in 
// diesen Zweig 

               } else if (lO instanceof Integer) {            
                         lFeld.put(lTemp.replaceAll("get","m").trim(),(String)String.valueOf(lO));
// weil nur strings in die Map kommen, kannst du eigentlich alle 
// anderen Typen automatisch mit String.valueOf(IO) reinlegen
// dazu brauchst du doch Integer nicht extra behandeln

               } else if (lO instanceof Rolle) {
// bezieht sich darauf, dass ein getter ein Objekt vom 
// Typ Rolle liefert
                  Method lTempMethod = lO.getClass().getMethod("getId",null);            
// ja und???
// jetzt hast du eine neue lTempMethod?
// warum legst du nichts in die Map?
// du veränderst die Schleifenvariable, das ist SEHR SCHLECHT
// ist beim nächsten Durchlauf doch futsch
               }
 

thE_29

Top Contributor
achja nochwas!

wie kann das ergebnis der get Methode die int zurückliefert, jemals eine instanz von Rolle sein?

würd mich stark wundern wenn int auf einmal zu ner Rolle wird :)
 

F4llen4ngel

Aktives Mitglied
hmm hab vorhin vergessen meinen kommentar mitzukopieren ...

Um die Bedingung zu testen siehts wie folgt aus:
Code:
else if (lO instanceof Benutzerrolle) {
	System.out.println("Bedingung wird 1x ausgeführt - ist richtig!");
	//System.out.println(lO.getClass().getMethod("getBezeichnung", null));		// FUNKTIONIERT!
	Method lTempMethod = lO.getClass().getMethod("getId",null);
	System.out.println(lTempMethod.invoke(this,null));					// GIBT DIE MITARBEITR-ID ZURÜCK?
}

so ich hoffe mit den kommentaren ist das noch ein klein wenig deutlicher!
 

thE_29

Top Contributor
das wird dir nie die ID vom Mitarbeiter oder sonstiges ausgeben, da du immer mit this die Busniessobjekt klasse selber auswählst!

beim invoke ist der 1.te parameter eine instanz von der klasse, wenn du sagst this, dann ist das die get Methode von deiner Klasse (sehr schlau :))

null kannst du sagen wenn die Methode static ist und ansonstens musst du vorher sagen newInstance() was dir aber eine neues Objekt anlegt und nicht dein vorhandenes nimmt!

achja, welche Klasse rolle?
wie sieht die aus? erbt die überhaupt von busniessobject?

warum postest du nicht einfach mal den ganzen quellcode dem man zum laufen braucht!

ich versteh ja net mal wozu du reflection brauchst, du könntest es normal genausogut aufrufen ;) :bahnhof:
 

F4llen4ngel

Aktives Mitglied
quellcode steht ansich alles oben ... alles was ich sonst noch habe ist eine test main methode die ein mitarbeiter objekt anlegt und dieses mit werten füllt. ausserdem noch eine rolle mit einer id und einer bezeichnung (erbt auch von BusinessObject)

und mehr nicht! ziel des ganzen soll es sein das ich mir jedes Objekt als ArrayList zurückliefern lassen kann - unabhängig davon welches Objekt ich haben will und unabhängig davon welches Objekt in diesem aufgerufen wird!

wenn wer weiss wie das anders geht - bitte um Vorschläge ;-)
 

thE_29

Top Contributor
poste trotzdem deinen kompletten code damit man ihn genauso wie du durchcompilieren kann und warum der deine Methoden findet versteh i trotzdem net, aber vielleicht geht das ja schon in 1.5, aber methoden fangen einfach nie mit get an, da kommt immer zuerst public/private/protected...
 

Bleiglanz

Gesperrter Benutzer
da machst du doch irgendwas fundamental falsch: ruf doch einfach alle getter auf, die eine leere Parameterliste haben und leg die Ergebnisse in eine Map (ist es das was du willst? warum so kompliziert mit deinen if's)???

Dein Quellcode reicht nicht! ist getId() in der Oberklasse vorhanden / abstract oder nicht, überschreibt die Unterklasse richtig. Poste den vollen Code der Oberklasse, den vollen Code der Unterklasse und den Aufruf, sonst kann man damit nix anfangen.

Du prüfst, ob die Instanz X einen getter hat, der ein Objekt vom Typ Benutzerrolle zurückgibt, das hat doch dann überhaut NICHTS mit dem Typ von X selbst zu tun?
Code:
else if (lO instanceof Benutzerrolle) {
   System.out.println("Bedingung wird 1x ausgeführt - ist richtig!");

//// ja, der getter hat IO geliefert, das vom Typ Benutzerrolle ist   

//System.out.println(lO.getClass().getMethod("getBezeichnung", null));    
// FUNKTIONIERT!


//// ja, IO ist Benutzerrolle und hat eine Methode getBezeichnung
//// da hat überhauptnichts mit mir = this zu tun

   Method lTempMethod = lO.getClass().getMethod("getId",null);
   System.out.println(lTempMethod.invoke(this,null));               
// GIBT DIE MITARBEITR-ID ZURÜCK?

//// ja, IO ist eine Benutzerrolle, und ich hole mir die Methode 
//// getId und rufe sie auf 
//// ABER NICHT MIT IO, SONDERN MIT THIS??????
////
//// jetzt also zweimal reflection gemacht
//// oben von mir selbst (this) einen getter geholt,
//// den aufgerufen, der hat mir eine Benutzerrolle geliefert und
//// jetzt mache ich nochmal Reflection und rufe die Methode 
//// getID von Benutzerrolle mit mir selbst als Objekt auf (this)
//// SOLL DAS SO RICHTIG SEIN????
}
 

F4llen4ngel

Aktives Mitglied
Der Quellcode oben ist bis auf überflüssige Getter udn Setter zu 100% mein Quellcode -
also nix fundamentales weggelassen!

Aus der Oberklasse wurde wurde nichts weggelassen weil man sonst wirklich nicht
durchsteigen würde seh ich ein ;-)

alles was ich weggelassen habe ist meine main methode die ein Mitarbeiter Objekt füllt
und eine Rolle übergibt - mehr nicht!

-------------------------

Habe meinen Fehler gefunden und zwar, wie Bleiglanz eben mehr oder weniger angedeutet hat rufe ich die Methode durch this auf - nicht durch lO ... also:
Code:
System.out.println(lTempMethod.invoke(this,null));
muss zu
Code:
System.out.println(lTempMethod.invoke(lO,null));
wusste nicht das ich das so einfach machen kann da ich mich zum ersten mal überhaupt in dieser Tiefe mit dem ganzen Kram beschäftige! Vielen Dank an alle die sich dem Problem angenommen haben ;-)

Und wenn einer weiss wie das ganze einfacher geht - immer her mit Vorschlägen :mrgreen:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
K Frage zum thema Java und Internet Allgemeine Java-Themen 49
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
G Polymorphie Programmdesign Frage Allgemeine Java-Themen 20
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5
M ArrayList<String> Frage Allgemeine Java-Themen 7
M OOP Design Frage Allgemeine Java-Themen 2
N Frage zur while-Schleife Allgemeine Java-Themen 18
T Best Practice Auslesen von Zeichenketten (Frage, Antworten, usw) Allgemeine Java-Themen 4
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
T Garbage Collection Frage Allgemeine Java-Themen 15
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
D Frage zu Java und Umlauten / charsets Allgemeine Java-Themen 2
B Frage zu Java und OpenGL? Allgemeine Java-Themen 3
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
A eine test thread.join() frage Allgemeine Java-Themen 2
DStrohma LayoutManager Frage zum GridBagLayout Allgemeine Java-Themen 4
F Frage zu Regex möglich Allgemeine Java-Themen 4
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Java Vector Frage Allgemeine Java-Themen 9
W Frage... Allgemeine Java-Themen 29
R Frage zur topologischen Sortierung Allgemeine Java-Themen 2
H Frage zu weka.core.Instance Allgemeine Java-Themen 3
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
T Frage zu Klassendesing Allgemeine Java-Themen 3
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
C Eclipse Wichtige frage Allgemeine Java-Themen 5
H Frage zu java.weka.core.Instances Allgemeine Java-Themen 3
S Frage zu Format Modifiers in Log4j Allgemeine Java-Themen 11
H Frage zu clone() Allgemeine Java-Themen 5
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
H2SO3- SCJP Chapter 3 Frage 10. Falsche Antwort? Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben