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):
e il file.java da compilare:codice:package compilazionedemo; public interface IPippo { void saluta(); }
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.codice:import compilazionedemo.IPippo; public class Prova implements IPippo{ public void saluta() { System.out.println("Hello World!"); } }
Adesso puoi compilare la classe in questo modo ed ottenere un riferimento all'oggetto istanziato di tipo interfaccia IPippo:
e per testarlo: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(); } }
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.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(); } }

Rispondi quotando