美文网首页
动态编译

动态编译

作者: kanaSki | 来源:发表于2019-07-07 22:29 被阅读0次

    动态编译应用场景:
    1、做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统。
    2、服务器动态加载某些类文件进行编译。
    动态编译的两种做法:
    -通过Runtime调用javac,启动新的进程去操作
    Runtime run=Runtime.getRuntime();
    Process process=run.exec("javac -cp d:/myjava/ HelloWorld");
    -通过JavaCompiler动态编译

        public static void main(String[] args) {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            int result = compiler.run(null, null, null, "d:/myjava/HelloWorld.java");
            System.out.println(result == 0 ? "编译成功" : "编译失败");
        }
    

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

    动态运行方式一:

            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("java -cp d:/myjava HelloWorld");
            InputStream in = process.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String str = "";
            if ((str = br.readLine()) != null) {
                System.out.println(str);
            }
    

    动态运行方式二:

            URL[] urls = {new URL("file:/d:/myjava/")};
            URLClassLoader loader = new URLClassLoader(urls);
            Class c = loader.loadClass("HelloWorld");
            // 数组不转为object类型,编译器会将数组分解传入,相当于参数是invoke(null,"aa","bb"),参数不匹配
            c.getMethod("main", String[].class).invoke(null, (Object) new String[]{});
    

    相关文章

      网友评论

          本文标题:动态编译

          本文链接:https://www.haomeiwen.com/subject/rkyihctx.html