Ciao a tutti, sono nuovo del forum
Ho letto questa discussione e il problema mi sembra analogo: non so se è meglio aprire questa discussione o continuare di là
Cmq... il mio problema è questo: ho una piccola applicazione java che deve istanziare (e usare, ovviamente!) oggetti di classi che si trovano di volta in volta in directory diverse. In sostanza esiste un file XML di configurazione dove viene specificato il percorso dove trovare le classi che servono (ad esempio "c:\mieclassi\pacchetto1") e l'applicazione deve poter instanziare un oggetto di tipo MioTipo, dove MioTipo.class si trova nel percorso indicato nell'XML.
Come posso fare?
Per non appesantire il post, vi scrivo il codice che riguarda strettamente il mio problema, ossia il meccanismo di loading.
Ho provato a buttar giù queste classettine:
classe interfaccia Interfaccia.java (si trova in c:\dir1)
(interfaccia implementata da Estensione.java)
codice:
public interface Interfaccia {
public String getName();
}
classe Principale.java (si trova in c:\dir1)
codice:
public class Principale {
public Principale() {
//il path in cui cercare le classi da caricare
java.net.URL[] pathRicerca = new java.net.URL[1];
try{
pathRicerca[0] = (new java.net.URI("file://c://dir2")).toURL();
System.out.println("pathCreato.");
} catch (java.net.MalformedURLException e){
System.out.println("Errore in creazione URI.");
System.out.println(e.toString());
} catch (java.net.URISyntaxException e){
System.out.println("Errore in creazione URI.");
System.out.println(e.toString());
}
java.net.URLClassLoader URLCL = new java.net.URLClassLoader(pathRicerca);
System.out.println("URLCL creato");
Class classe = null;
try{
classe = URLCL.loadClass("Estensione");
} catch (ClassNotFoundException e){
System.out.println("Non trovo la classe.");
System.out.println(e.toString());
}
Interfaccia classeCreata = null;
try{
classeCreata = (Interfaccia)classe.newInstance();
System.out.println("Classe creata.");
} catch (InstantiationException e){
System.out.println("Errore di instanziazione.");
System.out.println(e.toString());
} catch (IllegalAccessException e){
System.out.println("Errore di accesso.");
System.out.println(e.toString());
}
if (classeCreata != null){
String classeCreataName = classeCreata.getName();
System.out.println("Nome letto = " + classeCreataName);
}
}
public static void main(String[] args) {
new Principale();
}
}
classe Estensione.java (si trova in c:\dir2)
codice:
public class Estensione implements Interfaccia{
private String name = "";
public Estensione() {
this.name = "Due";
}
public String getName(){
return this.name;
}
}
Ovviamente in compilazione anche Estensione.java era in c:\dir1, poi ho spostato il .class (e anche il .java, ma poco importa) in c:\dir2.
Eseguendo Principale.java mi viene restituito un errore nella chiamata di loadClass: ClassNotFoundException. Ora, poichè la classe c'è, qual è l'errore?
Ho provato anche a chiamare loadClass con parametro "Estensione.class" e non solo con "Estensione" ma il risultato è lo stesso. Mettendo invece Estensione.class in c:\dir1 la classe viene trovata (non con il meccanismo normale, ma sempre con il loadClass).
Grazie a tutti quelli che mi aiuteranno