Java动态编译

一、动态编译

JAVA6.0引入了动态编译机制。
动态编译的应用场景:
可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统,需要进行安全检查。
服务器动态加载某些类文件进行编译
二、动态编译的两种做法:

1.通过Runtime调用javac,启动新的进程去操作(jdk5.0以前)

Runtime run=Runtime.getRuntime();  
Process process = run.exec("javac -cp e:/java/helloworld.java");  

2.通过javaCompiler动态编译(常用)

 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
        int flag = compiler.run(null, null, null,"E:/workspace/images/TestJava.java");  
        System.out.println(flag == 0 ? "编译成功" : "编译失败");  

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

例子

package test;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

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

public class Compile {
    public static void main(String[] args) throws IOException, Exception {  
        // 通过IO流创建一个临时文件,然后动态编译  
        String strjava = "public class TestJava"
                + "{public static void main(String[] args)"
                + "{System.out.println(\"this is the dynamic compile test!\");}}";  
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(  
                new FileOutputStream("D:\\TestJava.java")));  
        bw.write(strjava);  
        bw.flush();  
        bw.close();  

        //1. 动态编译  
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
        int flag = compiler.run(null, null, null,"D:\\TestJava.java");  
        System.out.println(flag == 0 ? "编译成功" : "编译失败");  

        //2.通过反射动态执行  
        try {  
            URL[] urls = new URL[] { new URL("file://" + "D:\\") };  
            URLClassLoader loader = new URLClassLoader(urls);  
            // 通过反射调用此类  
            Class clazz = loader.loadClass("TestJava");  
            Method m = clazz.getMethod("main", String[].class);  
            // m.invoke(null,new String[]{"aa","bb"});  
            // 由于可变参数是jdk5.0之后才有,上面代码会编译成m.invoke(null,"aa","bb");会发生参数不匹配的问题  
            // 因此必须加上Object 强转  
            m.invoke(null, (Object) new String[] {});  

        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

}
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值