最近,在利用java做一個Online Judge系統,裏面涉及到編譯java文件爲class文件,當時看過API文檔,也百度過別人的一些博客,感覺都不太符合個人胃口。雖然,有說得詳細的,也有很多權威的,也有很多使用例子的。但是主要是感覺學習成本過高了,他們都過多過少帶入到實際應用中,並沒有變成一個工具類,容易導致初學者的不耐煩。
我個人喜好的風格是,能快速應用到開發中,並能解決一般問題的,在實現基本效果取得信心後,再根據實際發展需求,研究API文檔,和更詳盡的博客,進入深度學習。所以,這裏給出一個可以直接用於使用的,簡單的一個實現代碼例子。
下面的代碼,可以直接拿來使用,至於StandardJavaFileManager , Iterable<String> options這些內容,參照下面的用法,以及稍微看一些API文檔,應該就能略懂一二了。這裏僅提供一個能直接使用,滿足一般需求的工具類,不展開具體分析。(我也還在深入學習中啦0.0,讓我們一起深入學習吧,共勉)
import java.io.File;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class JavaCompilerUtil {
private static JavaCompiler javaCompiler;
private JavaCompilerUtil() {
};
private static JavaCompiler getJavaCompiler() {
if (javaCompiler == null) {
synchronized (JavaCompilerUtil.class) {
if (javaCompiler == null) {
// 講道理,根據JavaCompiler 的獲取方式來看,應該是採用了單例模式的,但是這裏爲了順便複習一下單例模式,以及確保一下單例吧
javaCompiler = ToolProvider.getSystemJavaCompiler();
}
}
}
return javaCompiler;
}
public static boolean CompilerJavaFile(String sourceFileInputPath,
String classFileOutputPath) {
// 設置編譯選項,配置class文件輸出路徑
Iterable<String> options = Arrays.asList("-d", classFileOutputPath);
StandardJavaFileManager fileManager = getJavaCompiler()
.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjectsFromFiles(Arrays.asList(new File(
sourceFileInputPath)));
return getJavaCompiler().getTask(null, fileManager, null, options,
null, compilationUnits).call();
}
}