Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Java] Istanziare una classe reperibile in un path variabile

    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

  2. #2
    Risolto

    L'errore era molto stupido, costruivo malamente l'URL da dare poi in pasto alla classe URLClassLoader.
    Il codice corretto è:
    codice:
    File f = new File ("C:\\dir2");
    URL libreria = f.toURL();
    URL pathRicerca[] = new URL[]{libreria}
    e poi da qui si va via lisci come l'olio

    Ciao a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.