有时候需要在运行时动态生成源程序,然后编译。于是写了下面这个动态编译类(参考了网上的代码)
public class CompilerUtil {
public static boolean compile(String binPath, String clsName, String source) {
JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = cmp.getStandardFileManager(null, null, null);
JavaFileObject jfo = new StringJavaObject(clsName, source);
List<String> optionsList = new ArrayList<String>();
optionsList.addAll(Arrays.asList("-d", binPath));
List<JavaFileObject> jfos = Arrays.asList(jfo);
JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null, optionsList, null, jfos);
return task.call();
}
static class StringJavaObject extends SimpleJavaFileObject {
private String content;
public StringJavaObject(String fileName, String content) {
super(createUri(fileName), Kind.SOURCE);
this.content = content;
}
private static URI createUri(String name) {
return URI.create("String:///" + name + Kind.SOURCE.extension);
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}