# Class File zur Laufzeit laden ohne den Binary Name zu kennen



## ActionListener (7. Apr 2006)

Hallo,

habe folgendes Problem: Eine Anwendung bekommt ein Ordner in Form eines File Objektes  übergeben in dem sich eine Java Anwendung befindet. Es ist nicht bekannt wie die Klasse heisst in der sich die Main methode befindet und wie die Packagestruktur aussieht. 
Mithilfe eines Class Objektes könnte ich ja herausfinden ob sich eine Main Methode darin verbirgt. Aber wie komme ich zur Laufzeit an ein Class Objekt von einem class - File ran ohne den Binary name zu kennen? Vielen Dank und MFG!


----------



## Leroy42 (7. Apr 2006)

1. Erstell dir einen ClassLoader, der aus diesem Ordner class-files laden kann.
2. Durchlaufe den Ordner um die vorhanden ".class" Dateien aufzulisten.
3. Lade jede dieser Klassen mit deinem ClassLoader via classByName
4. Bestimme über reflection of die jeweilige Klasse ein static void main(String[] args) besitzt.
5. Rufe die main-Funktion dieser Klasse auf.
6. Vergiß den ganzen Blödsinn und denke dir eine vernünftigere Struktur aus.


----------



## ActionListener (7. Apr 2006)

Leroy42 hat gesagt.:
			
		

> 6. Vergiß den ganzen Blödsinn und denke dir eine vernünftigere Struktur aus.



Na das ist ja dann sehr hilfreich! Wenn Du denkst das es Blödsinn ist, was wäre denn dann ne bessere Lösung? Davon abbgesehn. Wie kann ich denn mit nem ClassLoader die Klasse laden wenn ich den binary name nicht kenne?


----------



## Leroy42 (7. Apr 2006)

Leroy42 hat gesagt.:
			
		

> 2. Durchlaufe den Ordner um die vorhanden ".class" Dateien aufzulisten.
> 3. Lade jede dieser Klassen mit deinem ClassLoader via classByName



Durch 2 erhälst du doch den Namen der Klasse.
Was überhaupt verstehst du unter _binary name_  :shock: 

Was die bessere Lösung betrifft, hängt davon ab, was du überhaupt erreichen willst.
Ich kann mir keine Anwendung vorstellen, die soetwas benötigt. Du weißt also weder
von vorneherein, wie die Main-Klassen heißen die du starten willst? Ok, kann vorkommen
aber woher bekommst du denn _diesen Ordner_? Kann die Anwendung, die diesen
Ordner erstellt denn nicht, beispielsweise, eine Textdatei mit dem Namen der Main-Klasse
in den Ordner erstellen?

Oder willst du einfach mal so deine Platte durchlaufen und alle Java-Programme starten?
Na dann viel Spaß  :shock:


----------



## mic_checker (7. Apr 2006)

Unabhängig davon wie viel sinn es nun macht oder nicht: Ich denke der prinzipielle mechanismus ist klar, über Reflection sollte sich das ganze lösen lassen.
Leroy hat das Prinzip ja schon beschrieben, wenn du den Namen der Datei nicht kennst, such halt nach der main. Ansonsten such nach nem Mechanismus den Namen im Ordner bekannt zu machen etc..

Also wo ist noch das Problem? Wenn du konkrete Fragen zur Reflection API hast, kannst du diese ja posten.


----------



## ActionListener (7. Apr 2006)

Das ich mit Punkt 2 den Klassennamen erhalte ist richtig, aber der hilft mir nicht sonderlich weiter. Ich benötige doch zum laden mit dem URLClassLoader den Namen in der Form Packagename.[Packagename].Klassenname.  Für die Klasse String wäre das z.B. java.lang.String. Das ist der Binary name. Siehe auch Java Doku unter ClassLoader. Oder gibt es einen ClassLoader der eine Klasse anhand eines Klassennamen findet?


----------



## mic_checker (7. Apr 2006)

warum verwendest du nicht forName?


----------



## ActionListener (7. Apr 2006)

Muss dafür die Klasse nicht im Classpath sein?


----------



## Leroy42 (7. Apr 2006)

ActionListener hat gesagt.:
			
		

> Oder gibt es einen ClassLoader der eine Klasse anhand eines Klassennamen findet?





			
				Leroy42 hat gesagt.:
			
		

> 1. Erstell dir einen ClassLoader, der aus diesem Ordner class-files laden kann.



Und sorry @ actionListener.

Es gibt tatsächlich den Begriff _binary name_  

War mir nur nicht geläufig und finde ich auch etwas merkwürdig, denn _java.lang.String_ ist
ja nicht nur der Name des Binary an sich.


----------



## mic_checker (11. Apr 2006)

ich denke du kannst auch einfach forName benutzen und vorher den Ordner etc. zum Klassenpfad hinzufügen, sollte eine Möglichkeit sein...


----------



## ActionListener (12. Apr 2006)

Naja gut, wie kann ich zur Laufzeit denn den Classpath anpassen? Klappt das laden der Klasse dann ohne Angabe des Binary Name?


----------



## Thomas Bender (12. Apr 2006)

Hallo,

zum laden der Klasse mit forName benötigst du den vollqualifizierten Klassenname (Binary Name).


MFG


----------

