[19/04/18-星期四] Java的动态性_动态编译(DynamicCompiler,Dynamic:动态的,Compiler:编译程序)

一、概念

应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行;服务器动态加载某些类文件进行编译

/***
 * 
 */
package cn.sxt.jvm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class Test_0418_DynamicCompiler {
    public static void main(String[] args) throws IOException {
        JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();//获得一个编译器
        //参数含义(需要输入时从哪里输入,往哪里输出,错误时输出位置,要编译文件的路径)  null代表控制台输入输出,正确编译返回0
        int result=compiler.run(null, null, null, "F:/MyEclipse/WorkSpace/注解_反射_字节码_JVM/HelloWorld.java");
        //System.out.println(result==0?"编译成功":"编译失败");
        
        //将字符串进行编译,借助IO流,将字符串存成一个临时文件,再调用编译方法
        String msg="public class HelloWorld{ public static void main(String[] args){System.out.println(\"你好!\");}}";
        
        //3、通过Runtime执行相关的类 
        Runtime run =Runtime.getRuntime();
        Process process=run.exec("java -cp  F:/MyEclipse/WorkSpace/注解_反射_字节码_JVM   HelloWorld");
        
        InputStream in =process.getInputStream();
        BufferedReader reader=new BufferedReader(new InputStreamReader(in));
        
        String info="";
        while ( (info=reader.readLine() )!=null) {
            System.out.println(info);    //把编译好的类输出
        }
        
        
    }

}

 

posted @ 2019-04-17 22:52  ID长安忆  阅读(160)  评论(0编辑  收藏  举报