2011-06-02 12 views
33

Quale sarebbe un buon modo per caricare dinamicamente i file di classe java in modo che un programma compilato in un jar possa leggere tutti i file di classe in una directory e usarli, e come si possono scrivere i file in modo che abbiano il nome del pacchetto necessario in relazione al barattolo?Metodo per caricare dinamicamente file di classe java

risposta

70

Credo che sia un ClassLoader che stai cercando.

Suggerisco di iniziare osservando l'esempio seguente che carica i file di classe che non si trovano sul percorso della classe.

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+4

+1 URLClassLoader è la strada da percorrere! – OscarRyz

+0

Sì, credo che ClassLoader sia quello che sto cercando. Tuttavia, puoi pensare a un modo per utilizzare efficacemente la classe caricata? Potrei farlo implementare un'interfaccia ... ma come potrei fare riferimento a quell'interfaccia? Hmm ... forse se dovessi aggiungere il vaso compilato come un vaso esterno ... in tal caso, che cosa dovrei chiamare il pacchetto della classe caricata? Se ho: /thing/myjar.jar e thing/loadedclasses/class.class, quale sarebbe il pacchetto dichiarato per quella classe? – MirroredFate

+0

Sì, dovresti concordare alcune interfacce o classi astratte che implementano/estendono le classi da caricare. (Oppure affidarsi completamente alla riflessione per le classi caricate.) – aioobe

1

Se si aggiunge una directory al percorso di classe, è possibile aggiungere le classi dopo l'avvio dell'applicazione e quelle classi può essere caricato non appena sono stati scritti nella directory.

7
MyClass obj = (MyClass) ClassLoader.getSystemClassLoader().loadClass("test.MyClass").newInstance(); 
obj.testmethod(); 

o

MyClass obj = (MyClass) Class.forName("test.MyClass").newInstance(); 
obj.testmethod(); 
Problemi correlati