利用JavaCompiler編譯java文件(一個簡單封裝的工具類)

  最近,在利用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();
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章