博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态性(1) - 动态编译(DynamicCompile)
阅读量:6504 次
发布时间:2019-06-24

本文共 2265 字,大约阅读时间需要 7 分钟。

1.动态编译

  • Java 6.0 引入了编译机制
  • 动态编译的应用场景:

    • 可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统
    • 服务器动态加载某些类文件进行编译
  • 动态编译的两种做法:

    • 通过Runtime调用javac,启动新的进程去操作(6.0之前,不是真正的动态编译)

      Runtime run = Runtime.getRuntime();

      Process process = run.exec("javac -cp d:/myjava/Helloworld.java")

    • 通过JavaCompiler动态编译
  • 通过JavaCompiler动态编译

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

    int result = compiler.run(null, null, null, "f:/HelloWorld.java");

    Parameters:
    in "standard" input; use System.in if null
    out "standard" output; use System.out if null
    err "standard" error; use System.err if null
    arguments arguments to pass to the tool

栗子:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();int result = compiler.run(null, null, null, "f:/HelloWorld.java");System.out.println(result==0?"编译成功":"编译失败");

2.动态运行编译好的类

  • 通过Runtime.getRuntime()运行启动新的进程运行
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();int result = compiler.run(null, null, null, "f:/HelloWorld.java");System.out.println(result==0?"编译成功":"编译失败");Runtime run = Runtime.getRuntime();Process process = run.exec("java -cp f: HelloWorld");        BufferedReader w = new BufferedReader(new InputStreamReader(process.getInputStream()));System.out.println(w.readLine());
  • 通过反射运行编译好的类
import java.io.IOException;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;import javax.tools.JavaCompiler;import javax.tools.ToolProvider;public class DynamicCompile {    public static void main(String[] args) throws IOException {        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();        int result = compiler.run(null, null, null, "f:/HelloWorld.java");        System.out.println(result==0?"编译成功":"编译失败");            try {            URL[] urls = new URL[]{new URL("file:/"+"f:/")};            URLClassLoader loader = new URLClassLoader(urls);            Class
c = loader.loadClass("HelloWorld"); Method m = c.getMethod("main", String[].class); m.invoke(null, (Object)new String[]{});//静态方法不用谢调用的对象 //加Object强制转换的原因 //由于可变参数是JDK5.0之后才有 m.invoke(null, new String[]{"23","34"}); //编译器会把它编译成m.invoke(null,"23","34");的格式,会发生参数不匹配的问题 //带数组的参数都这样做 } catch (Exception e) { e.printStackTrace(); } }}

转载地址:http://sbqyo.baihongyu.com/

你可能感兴趣的文章
(译)OpenGL ES2.0 – Iphone开发指引
查看>>
@RestController 与 @RequestMapping
查看>>
黑马程序员.bobo.DAY.1
查看>>
Unity shader 官网文档全方位学习(二)
查看>>
pbrun
查看>>
浏览器加载和渲染网页顺序
查看>>
深入剖析Android系统试读样章
查看>>
yaf的安装
查看>>
比较java与C++的不同
查看>>
Twitter Storm入门
查看>>
Ansible自动化运维配置与应用(结合实例)
查看>>
下面简要介绍软件工程的七条原理
查看>>
Lua(三)——语句
查看>>
怎么看电脑有没有安装USB3.0驱动
查看>>
overflow清除浮动的原理
查看>>
Spring Boot 使用parent方式引用时 获取值属性方式默认@
查看>>
解决maven下载jar慢的问题(如何更换Maven下载源)
查看>>
linux安装gitLab
查看>>
concurrent包的实现示意图
查看>>
golang os.Args
查看>>