zoukankan      html  css  js  c++  java
  • 8.3(java学习笔记)动态编译(DynamicCompiler)与动态运行(DynamicRun)

    一、动态编译

      简单的说就是在运行一个java程序的过程中,可以通过一些API来编译其他的Java文件。

      下面主要说动态编译的实现:

      1、获取java编译编译器

      2、运行编译器(须指定编译文件)

      获取编译器通过JavaCompiler ToolProvider.getSystemJavaCompiler();//返回该平台提供的JAVA语言编译器

      运行调用int run(InputStream in,OutputStream out,OutputStream err,String... arguments);

      其中in,代表为java编译器提供信息,out为获取编译器输出信息,err获取编译器错误信息。

      如果设置为null则使用System.in(键盘输入),System.out(控制台输出),Sytem.err(控制台输出错误信息)。

      arguments为字符串类型可变参数,代表被编译文件地址,可编译多个文件。方法运行成功返回0。

      

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    public class TestDynamicCompile {
        public static void main(String[] args) throws IOException {
            //获取编译器
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            //编译时空指针异常
            //文件位置 F:/TestJava/HelloWorld.java
            //运行编译器,编译指定文件
            int compilerFlag = compiler.run(null,null,null,"F:/TestJava/HelloWorld.java");
            //成功返回0.
            System.out.println(compilerFlag==0?"true":"false");
        }
    }
    运行结果:
    true

    注:这里运行时在

     int compilerFlag = compiler.run(null,null,null,"F:/TestJava/HelloWorld.java");
    可能会报一个NullPointerException异常,问题原先jre下lib目录中没有tools.jar文件,该方法是此文件提供的。
    解决方法:点击IDE菜单栏Window->Preferences->java->installed JREs右侧会显示jre路径,找到这个路径中lib在里面添加tools.jar文件。
    tools.jar文件在下载的java文件夹中的lib目录下可以找到(网上有的说是java文件下jdk下的lib)。(实在找不到就搜索,还是找不到网上下)

     

    动态编译前:

    动态编译后:

     

    二、动态运行

      动态运行,即在运行一个java程序的过程中通过调用API,运行另外一个java程序。

      

      要实现这个功能先得了解两个类:

      Runtime:每个java程序都有一个类运行时的实例,允许应用与当前运行环境进行交互。

      说的简单一点,就是在当前平台(windows)上运行的java程序,可以通过这个类来让当前平台(window)帮我们完成一些操作。

      这个类无法通过new来创建对象,只能通过Runtime.getTime()初始化对象。

      其中有一个方法,exec(String commad),在单独的进程中执行指定的命令。

      exec这个有些类似:(Windos+R)

      

      带会可以将exec里面运行java程序的语句改成"notepad.exe",会发现和在上述对话框中输入后运行的结果是相同的。

      都是打开了记事本。在打开(0)中输如java -cp F:/TestJava HelloWorld ,和在程序中调用exec(java -cp F:/TestJava HelloWorld),

      是一样的结果,但这个对话框中会打印出hello world,但这个对话框一闪而过。

      如果了解DOS命令的话:(Windows + R) 然后输入cmd回车。弹出DOs窗口

      

      运行结果都是一样的,都是本地运行环境执行指定命令。

      exec是本地运行环境执行指定字符串中的命令,结合这两个理解。

      exec执行完后会返回一个Process对象。

      Process:可用于控制进程并获取有关进程的信息。类Process提供了用于执行来自进程的输入、

      执行对进程的输出、等待进程完成、检查进程的退出状态以及销毁(终止)进程的方法。

      流程:1.当前java程序通过getTime()获取可以和当前平台交互的实例。

         2.使用这个实例中的exec方法执行相关操作。(此处的命令是当前运行平台(windows)去执行的)

         3.通过exec方法返回Process对象,获取这个进程的输入流。

         4.通过这个进程的输入流读取运行结果,打印到控制台输出。

       

      这里使用之前动态编译好的类,程序的运行结果只是输出Hello World.

      

      

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    public class TestDynamicCompile {
        public static void main(String[] args) throws IOException {
            Runtime run = Runtime.getRuntime();//获取与当前平台进行交互的实例
            Process process = run.exec("java -cp F:/TestJava HelloWorld");//当前平台执行对应命令
            BufferedReader br =new BufferedReader(new InputStreamReader(process.getInputStream()));//获取执行进程的输入流
            String runInfo = null;
            while(null != (runInfo = br.readLine())){//读取执行结果并输出
                System.out.println(runInfo);
            }
        }
    }
    运行结果:
    Hello World!

        

  • 相关阅读:
    选择器
    【兼容】text
    SQL2008的数据更新跟踪测试
    拖拽文件到RichEdit的后期处理
    Web Browser 的扩展
    URL Protocol Handler
    asterisk1.6异步脚本
    CSDNER如何才能做到"最不缺的是技术"
    关于SQL语句Count的一点细节
    TG787 脚本
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10067580.html
Copyright © 2011-2022 走看看