Lo que necesita es una clase que se extiende JavaFileObject
import java.net.URI;
import javax.tools.SimpleJavaFileObject;
public class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
public JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
que puede ser utilizado de la siguiente manera:
JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
if(jc == null) throw new Exception("Compiler unavailable");
String code = "public class CustomProcessor { /*custom stuff*/ }";
JavaSourceFromString jsfs = new JavaSourceFromString("CustomProcessor", code);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(jsfs);
List<String> options = new ArrayList<String>();
options.add("-d");
options.add(compilationPath);
options.add("-classpath");
URLClassLoader urlClassLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
StringBuilder sb = new StringBuilder();
for (URL url : urlClassLoader.getURLs()) {
sb.append(url.getFile()).append(File.pathSeparator);
}
sb.append(compilationPath);
options.add(sb.toString());
StringWriter output = new StringWriter();
boolean success = jc.getTask(output, null, null, options, null, fileObjects).call();
if(success) {
logger.info(LOG_PREFIX + "Class has been successfully compiled");
} else {
throw new Exception("Compilation failed :" + output);
}
me encontré con este ejemplo, que es exactamente lo que necesito. http://www.ibm.com/developerworks/java/library/j-jcomp/index.html – user566822