Reflection

Status
Nicht offen für weitere Antworten.

caty

Mitglied
Hallo Leute!

Ich habe eine Frage zum Thema Reflection. Ich beschäftige mich noch nicht so lange mit dem Thema, vielleicht kann mir jemand einen Tipp geben.

Ich wollte externe Libraries in mein Programm einbinden, die sich in jar-Dateien befinden. Also erzeuge ich ein Objekt vom Typ URLClassLoader so:

Code:
URLClassLoader loader = new URLClassLoader( ein Array mit Pfaden zu den Jar-Dateien );

Jetzt wollte ich ein Objekt von einem Typ, der sich in einer dieser Dateien befindet, erzeugen. Also suche ich nach der Klasse im "loader" und erzeuge das Objekt. Nun will ich eine Methode mit diesem Objekt aufrufen, das funktioniert auch super mit der Methode "invoke". Das Problem nun ist, dass diese Methode eine Exception werfen kann und in diesem Fall bekomme ich eine NoClassDefFoundError, da sich die ExceptionKlasse auch im "loader" befindet. Und da sucht er natürlich nicht, wenn der Fall eintrifft.

Gibt es eine Möglichkeit anzugeben, wo er im Fall einer Exception suchen soll?

Ich danke für jede Hilfe.
 

Wildcard

Top Contributor
Warum nimmst du die anderen jars nicht in den Classpath auf und sparst dir den URLClassLoader?
 

caty

Mitglied
Ich kann die Jar-Dateien nicht sofort im ClassPath aufnehmen, da sie erst mit dem Programm ausgesucht werden. Also weiß ich vorher nicht welche es werden.

Kann ich sie später auch im ClassPath aufnehmen?
 

y0dA

Top Contributor
Ja!
zb so:
Code:
			URL jarURL = new File(path + jarName).toURL();
			ClassLoader classLoader = Thread.currentThread().getContextClassLoader();			
			if (classLoader != null && (classLoader instanceof URLClassLoader)) {
				URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
				Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
				addURL.setAccessible(true);
				addURL.invoke(urlClassLoader, new Object[]{jarURL});				
				Class c = classLoader.loadClass(className);
 

caty

Mitglied
So fügt man wahrscheinlich weitere URLs zum ClassLoader hinzu. Bei mir sind aber bereits alle URLs, die ich brauche im ClassLoader. Das Problem ist nur, beim Ausführen irgendeiner Methode, die sich im ClassLoader befindet, könnte eine Exception geworfen werden. Die Exception-Klasse ist auch im ClassLoader, aber die wird nicht gefunden bzw. dort wird beim Ausführen der Methode nicht gesucht.

Hat jemand eine Idee, wie ich dorthin verweisen könnte?
 

y0dA

Top Contributor
caty hat gesagt.:
Ich kann die Jar-Dateien nicht sofort im ClassPath aufnehmen, da sie erst mit dem Programm ausgesucht werden. Also weiß ich vorher nicht welche es werden.

Kann ich sie später auch im ClassPath aufnehmen?

Meine Antwort stellt die Antwort zu dieser Frage dar - du musst die schon korrekt artikulieren!


caty hat gesagt.:
So fügt man wahrscheinlich weitere URLs zum ClassLoader hinzu. Bei mir sind aber bereits alle URLs, die ich brauche im ClassLoader. Das Problem ist nur, beim Ausführen irgendeiner Methode, die sich im ClassLoader befindet, könnte eine Exception geworfen werden. Die Exception-Klasse ist auch im ClassLoader, aber die wird nicht gefunden bzw. dort wird beim Ausführen der Methode nicht gesucht.

Hat jemand eine Idee, wie ich dorthin verweisen könnte?

Hiermit kann man externe JARs nachladen, was ja auch deine Frage war. Lade halt einfach die Exceptionklasse auch nach..
 

caty

Mitglied
Sorry, vielleicht hab ich mir falsch ausgedrückt. Meinst du mit "Exceptionklasse nachladen" diese zum ClassLoader hinzufügen? Wie ich oben bereits geschrieben habe, ist die Klasse bereits da und sie wird trotzdem nicht gefunden.
 

y0dA

Top Contributor
Also ohne Code kann dir hier sicher niemand helfen bzw. welche Exception wird geworfen?

Und was meinst du mit, "die Klasse ist bereits da"?

Also bitte um Code, dann kann dir hier sicher jemand weiterhelfen.
 

quippy

Bekanntes Mitglied
a) es genügt nicht, eine neuen Classloader zu erzeugen, wie Du es im ersten Post tust. ClassLoading funktioniert so, daß eine Klasse, welche eine weitere Klasse nachladen will, den Classloader befragt, der sie selbst geladen hat.
--> Classloader erzeugen und dann mit diesem ClassLoader die erste Klasse nachladen. Diese wird dann für alle weiteren Klassen den neuen ClassLoader verwenden.

b) das vorgestellte Beispiel, denn aktuellen Classloader um die neuen URLs zu erweitern, ist ein *dirty Hack* und daher zu vermeiden. Es wird eine private oder protected deklarierte Methode "addURL" via Reflection angespochen - da diese nicht public ist, kann sie einfach verschwinden und muß daher in zukünftigen Java-Versionen nicht mehr funktionieren.

Alternativ mußt Du einen ClassLoader schreiben, bei dem das dynamische hinzufügen von URLs zu beliebigen Zeiten möglich ist. Dann schreibst Du Dir einen Programmstarter, der als erstes diesen ClassLoader erstellt und dann die eigentliche Main-Class damit nachläd. Das wäre eine saubere Lösung.

ACHTUNG: durch das interne Caching von nachgeladenen Klassen ist es nicht ohne weiteres möglich, einmal geladene Klassen durch andere wieder zu ersetzen.

Google hat da auch was zu
 

caty

Mitglied
Danke für die Tipps, das hört sich alles ziehmlich kompliziert an. Deswegen hab ich mich für eine einfachere Lösung entschieden. Ich kopiere meine Libraries vor dem Start des Programms dorthin, wo danach garantiert gesucht wird. :)
 
I

Ivan

Gast
hallo leute. habe ein problem mit der java reflection. habe code geschrieben, welche die werte einer eingabemaske löschen soll und es funzt nicht, hierist die code:
Code:
Class klasslot=maske.getClass();
		       Field[] field = klasslot.getDeclaredFields();
		       
		      
		       for(int i=0;i<field.length;i++){
		    	   try{
		    		   if( Class.forName("javax.swing.JTextField").isInstance(field[i]))
		               {field[i].set(maske,"");}
		               if( Class.forName("javax.swing.JTextArea").isInstance(field[i]))
		               {field[i].set(maske,"");}
		               if( Class.forName("javax.swing.JCheckBox").isInstance(field[i]))
		               {field[i].setBoolean(maske,false);}
		       //System.out.println(field[i].get(maske));//+"="+fff[i].get(lot));//.get(lot));
		    		   //if(i<fff.length-1)
		    	   }catch(Exception exc){exc.printStackTrace();}
		       }
währe nicht schlecht wenn mir jehmand helfen kann
danke

[Edit by Beni: Codetags]
 

Ariol

Top Contributor
1. Warum machst du das über reflections?
2. Ich glaube getDeclaredFields ist nicht das was du brauchst...

Code:
		Component[] c = maske.getComponents();
		
		System.err.println(c.length);
		
		for (int i = 0; i < c.length; i++)
		{
			if(c[i] instanceof JTextField)
			{
				((JTextField)c[i]).setText("");
			}
		}

Worauf du achten musst:
Wenn Maske ein JFrame ist musst du statt
Code:
Component[] c = maske.getComponents();
Code:
Component[] c = maske.getContentPane().getComponents();
schreiben
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
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
M reflection in inner classes Allgemeine Java-Themen 7
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
I reflection get inner static classes Allgemeine Java-Themen 2
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

Neue Themen


Oben