利用JavaCompiler编译java文件(一个简单封装的工具类)

  最近,在利用java做一个Online Judge系统,里面涉及到编译java文件为class文件,当时看过API文档,也百度过别人的一些博客,感觉都不太符合个人胃口。虽然,有说得详细的,也有很多权威的,也有很多使用例子的。但是主要是感觉学习成本过高了,他们都过多过少带入到实际应用中,并没有变成一个工具类,容易导致初学者的不耐烦。

  我个人喜好的风格是,能快速应用到开发中,并能解决一般问题的,在实现基本效果取得信心后,再根据实际发展需求,研究API文档,和更详尽的博客,进入深度学习。所以,这里给出一个可以直接用于使用的,简单的一个实现代码例子。

下面的代码,可以直接拿来使用,至于StandardJavaFileManager , Iterable 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 options = Arrays.asList("-d", classFileOutputPath);
        StandardJavaFileManager fileManager = getJavaCompiler()
                .getStandardFileManager(null, null, null);

        Iterable compilationUnits = fileManager
                .getJavaFileObjectsFromFiles(Arrays.asList(new File(
                        sourceFileInputPath)));

        return getJavaCompiler().getTask(null, fileManager, null, options,
                null, compilationUnits).call();
    }
}


你可能感兴趣的:(Java杂七杂八)