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.