一、动态编译

  简单的说就是在运行一个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!

    

8.3(java学习笔记)动态编译(DynamicCompiler)与动态运行(DynamicRun)的更多相关文章

  1. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  2. Java学习笔记之方法重载,动态方法调度和抽象类

    一.方法重载 如果子类中的方法与它的超类中的方法有相同的方法名,则称子类中的方法重载超类中的方法,特别是当超类和子类中的方法名和参数类型都相同时,在子类中调用该方法时,超类中的方法会被隐藏.考虑下面程 ...

  3. Java学习笔记四---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  4. Java学习笔记4---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  5. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  6. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  7. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  8. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  9. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

随机推荐

  1. 迅雷Bolt的ClipSubBindBitmap函数特别说明

    因为在工作中基于迅雷Bolt开发的是IM产品,需要实现自定义用户头像的功能. 但Bolt中对图像的默认拉伸锯齿效果非常明显,所以自己实现了图像拉伸函数,代码已共享,具体可查看:<迅雷Bolt图像 ...

  2. MySQL 8.0.11(zip)安装及配置

    (1)下载MySQL8.0.11: (2)解压zip文件: 我解压到了D:/MySQL/mysql-8.0.11-winx64 (3)配置环境变量:   右键此电脑->属性 高级系统设置 环境变 ...

  3. java 身份证15位转18位

    /** * 根据身份证号获取性别 * * @param pid * 身份证号 * @return 性别 F为女M为男 */ public static String getSexByPid(Strin ...

  4. 有关javamelody的配置

    一:前沿 在这里我学到了怎么来使用开源的东西,也第一次去接触有关性能方面检测的开源框架,javamelody是性能检测的,刚刚看的时候我什么都不知道的,但是自己接触了,才知道一点大概思路吧.下面来记载 ...

  5. [洛谷P1032] 字串变换

    洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...

  6. Python基础(2)_if、for、while流程控制

    一.流程控制 1.条件语句 1.1单分支 1.2多分支 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. a = 5 if a > 2: print('yes') 根据Py ...

  7. [BZOJ1441&BZOJ2257&BZOJ2299]裴蜀定理

    裴蜀定理 对于整系数方程ax+by=m,设d =(a,b) 方程有整数解当且仅当d|m 这个定理实际上在之前学习拓展欧几里得解不定方程的时候就已经运用到 拓展到多元的方程一样适用 BZOJ1441 给 ...

  8. 【目录】Python学习笔记

    目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...

  9. 如何完全禁用或卸载Windows 10中的OneDrive

    该功能占用很大的内存与CPU 详见http://os.51cto.com/art/201508/489371.htm

  10. busybox syslog介绍

    busybox中提供了一个syslog. 配置日志处理规则 可通过设置/etc/syslog.conf具体配置不同log的处理规则,以下的简单配置,将log全部写到/var/log/messages和 ...