这里自己记录了下Runtime类以及ProcessBuilder,ProcessImpl之间的关系,还有通过反射来实现Runtime,ProcessBuilder, ProcessImpl
RunTime类进行exec的流程
其实它的本质是一个: 运行时环境,听起来好像不太好理解,这个"运行时环境其实也就是"java虚拟机的运行环境"!
首先先看源码:Runtime类
public class Runtime,它是一个公有类
构造函数:private Runtime() {},构造函数为私有,说明不能直接实例化该对象
private static Runtime currentRuntime = new Runtime();,这句话可以看出来currentRuntime这个属性本身是一个Runtime的类
继续看,那么应该就知道了,这个Runtime类是遵循单例模式的,每次运行的对象就只有一个,所以在java程序中不同线程通过调用Runtime.getRuntime()获得的是同一个对象实例,也就是说一个java进程中只有一个Runtime实例
public static Runtime getRuntime() {
return currentRuntime;
}
Runtime有个exec的方法,并且对应的重载方法有多个,并且执行完之后返回的是Process类的实例,是一个进程类的实例对象
public Process exec(String command) throwsIOException
public Process exec(String command,String[] envp)
public Process exec(String command,String[] envp, File dir)
public Process exec(String cmdarray[])throws IOException
这里得细说exec这个方法,该exec返回的是一个Process类的实例,那么这里就可以知道了它实则是创建了一个进程,让进程来执行我们传入的command命令
这里得跟下exec方法的大概流程,这里执行的是一条命令执行的代码,如下:
InputStream in = Runtime.getRuntime().exec("whoami").getInputStream();
首先跟进exec的方法,发现还是一个exec方法
它继续跟进exec方法中,继续跟