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
33
A
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) {
}
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();
+1 URLClassLoader è la strada da percorrere! – OscarRyz
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
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