Visualizzazione dei risultati da 1 a 5 su 5

Visualizzazione discussione

  1. #2
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ciao,
    un modo per farlo sarebbe fare realizzare alla classe da compilare un interfaccia che dichiara tutti i metodi da usare.
    Es(con un solo metodo):
    codice:
    package compilazionedemo;
    
    public interface IPippo {
        void saluta();
    }
    e il file.java da compilare:
    codice:
    import compilazionedemo.IPippo;
    public class Prova implements IPippo{
        public void saluta() {
            System.out.println("Hello World!");
        }
    }
    Da notare che la classe non farà parte dei package del tuo programa, quindi non devi specificare il package e devi fare l'import di tutte le classi/interfacce che userai.

    Adesso puoi compilare la classe in questo modo ed ottenere un riferimento all'oggetto istanziato di tipo interfaccia IPippo:
    codice:
    package compilazionedemo;
    
    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.Arrays;
    import javax.tools.JavaCompiler;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.ToolProvider;
    
    public class CompilatoreDemo {
        public IPippo compile(String fileAbsolutePath) throws MalformedURLException, 
                ClassNotFoundException, InstantiationException, IllegalAccessException{
            //Il compilatore
            JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
    
            //Il gestore dei file da compilare
            StandardJavaFileManager sjfm = jc.getStandardFileManager(null, null, null);
            
            //Il file da compilare
            File javaFile = new File(fileAbsolutePath);
    
            //Una collezione di file da compilare; nel nostro caso solo uno
            Iterable fileObjects = sjfm.getJavaFileObjects(javaFile);
    
            //Cartella dove inserire il file compilato ovvero la cartella /bin
            String dir=System.getProperty("user.dir");
           
            String[] options = new String[]{"-d", dir};
            //Esegue la compilazione
            jc.getTask(null, null, null, Arrays.asList(options), null, fileObjects).call();
    
            //Costruzione dell'url della cartella dove è presente il file compilato
            URL[] urls = new URL[]{ new URL("file://"+dir+File.separator) };
    
            //Creazione del caricatore della classe compilata
           URLClassLoader ucl = new URLClassLoader(urls);
            
            //Costruzione nome classe
            String className=fileAbsolutePath.substring(
                    fileAbsolutePath.lastIndexOf(File.separator)+1,
                    fileAbsolutePath.indexOf("."));
    
            //caricamento classe
            Class clazz = ucl.loadClass(className);
            
            //Creazione oggetto
            return (IPippo) clazz.newInstance();
            
        }
    }
    e per testarlo:
    codice:
    package compilazionedemo;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    
    public class Main {
    
        public static void main(String[] args) throws IOException,MalformedURLException,ClassNotFoundException,
                        InstantiationException,  IllegalAccessException {
         
            File f = new File ("Prova.java");
            CompilatoreDemo cd = new CompilatoreDemo();
            IPippo unPippo = cd.compile(f.getAbsolutePath());
            unPippo.saluta();
        }
    }
    Sono uno studente anch'io e ho preso spunto da un progettino che avevo fatto alle superiori un paio di anni fa e da allora non ho più approfondito l'argomento; probabilmente ci sono modi migliori per farlo ma spero che possa almeno aiutarti ad inquadrare il problema.
    Ultima modifica di Nikopol; 19-07-2014 a 02:34 Motivo: errore di battitura

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 © 2025 vBulletin Solutions, Inc. All rights reserved.