Java 动态编译

Java1.6以后引入动态编译,在做一个浏览器端编写java代码,上传服务器编译和运行的在线评测
系统或是服务器动态加载某些类文件进行编译的时候就用到了动态编译:
通过JavaCompiler动态编译:

1
2
3
4
5
6
7
public static int compileFile(String sourceFile){
//动态编译
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null,sourceFile);
System.out.println(result==0?"编译成功":"编译失败");
return result;
}

• 第一个参数:为java编译器提供参数
• 第二个参数:得到 Java 编译器的输出信息
• 第三个参数:接收编译器的 错误信息
• 第四个参数:可变参数(是一个String数组)能传入一个或多个 Java 源文件
• 返回值:0表示编译成功,非0表示编译失败

动态运行编译好的类:

  • 通过Runtime.getRuntime()运行启动新的进程运行
    1
    2
    Runtime run = Runtime.getRuntime();
    Process process = run.exec("java -cp path HelloWorld");
  • 通过反射运行编译好的类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //通过反射运行程序
    public static void runJavaClassByReflect(String dir,String classFile) throws Exception{
    try {
    URL[] urls = new URL[] {new URL("file:/"+dir)};
    URLClassLoader loader = new URLClassLoader(urls);
    Class c = loader.loadClass(classFile);
    //调用加载类的main方法
    Method m = c.getMethod("main",String[].class)
    m.invoke(null, (Object)new String[]{});//反射调用main方法加(object)强制转型
    } catch (Exception e) {
    e.printStackTrace();
    }
    }