Java动态编译

1.应用场景

客户端上传代码在线编译的系统,服务器动态加载某些类文件进行编译,热部署功能实现

2.动态编译实现

1利用java启动新进程操作

Runtime run = Runtime.getRuntime();
 
Process process = run.exec("java -cp d:/my/java HelloWorld");

2通过JavaComplier动态编译

3.测试

1.在本地创建一个java文件,并编写main方法

img

编写客户端

2.编写测试类

img

本地多了一个class文件

img

3.动态运行
3.1应用程序调用
public class Test01 {
 
    public static void main(String[] args) throws Exception {
 
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
 
        int run = compiler.run(null, null, null,"D:/Java/Test02.java");
 
        System.out.println(run == 0 ? "编译成功" : "编译失败");
 
        Runtime runtime = Runtime.getRuntime();
 
        Process process = runtime.exec("java -cp D:/Java Test02");
 
        //只做测试,为了简洁没关闭流
 
        InputStream inputStream = process.getInputStream();//将编译到的内容打印在控制台上
 
        BufferedReader bis = new BufferedReader(new InputStreamReader(inputStream));
 
        String line = "";
 
        while((line = bis.readLine()) != null) {
 
            System.out.println(line);
 
        }
 
    }
 
}

运行结果

img

3.2 反射调用
import java.net.URL;
 
import java.net.URLClassLoader;
 
import javax.tools.JavaCompiler;
 
import javax.tools.ToolProvider;
 
public class Test01 {
 
    public static void main(String[] args) throws Exception {
 
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
 
        int run = compiler.run(null, null, null,"D:/Java/Test02.java");
 
        System.out.println(run == 0 ? "编译成功" : "编译失败");
 
        try {
 
            URL[] urls = new URL[]{new URL("file:/"+"D:/Java/")};
 
            URLClassLoader loader = new URLClassLoader(urls);
 
            Class<?> clazz = loader.loadClass("Test02");
 
            //调用main方法
 
            clazz.getMethod("main", String[].class).invoke(null, (Object)new String[]{});
 
        } catch (Exception e) {
 
            e.printStackTrace();
 
        }
 
    }
 
}

运行结果

img

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

terrybg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值