【0018】探秘Runtime、System等系统相关类

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

本文将介绍Java中的常见的系统相关类,如Runtime、System、Process、SecurityManager等类,同时也会介绍其关联的一些包级私有的类,以及一些常见用法。


本文大纲:

1Runtime

2System

3Process

4SecurityManager

5、总结



一、Runtime

每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime()方法获取当前运行时,应用程序不能创建自己的 Runtime 类实例。查看源码可知Runtime类是单例的,如下所示:


【0018】探秘Runtime、System等系统相关类


Runtime类实例中可以查看当前虚拟机中的空闲内存大小、总内存大小、可用内存大小,运行垃圾回收器方法、退回当前虚拟机,以及运行操作系统命令,加载动态库等工作都是在此类完成。API如下图所示:


【0018】探秘Runtime、System等系统相关类

【0018】探秘Runtime、System等系统相关类


下面介绍一下如何运行命令,执行其他程序,这部分在实际开发中可能会使用到,比如在程序中调用ORACLE中的sqlldr命令来批量导入数据。Runtime中执行其他程序的方法是exec方法,该方法返回一个Process对象,对于Process类会在下面的第三节中详细介绍。


【0018】探秘Runtime、System等系统相关类


程序运行将打印ip地址信息。Runtime类中有一个有趣的方法,就是addShutdownHook(Thread hook)方法,可以允许虚拟机关闭前运行一个钩子线程。


【0018】探秘Runtime、System等系统相关类


运行结果:

【0018】探秘Runtime、System等系统相关类


二、System

System 类包含一些有用的类字段和方法。它不能被实例化。在System类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。


下面程序通过System类来访问操作系统的环境变量和系统属性。


【0018】探秘Runtime、System等系统相关类


System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。实际上它们都返回当前时间与UTC1970年1月1日午夜的时间差,前者以毫秒做单位,后者以纳秒为单位,但是必须指出的是,这两个方法返回的时间粒度取决于底层操作系统,可能所在的操作系统根本不支持毫秒、纳秒作为计时单位。


例如:许多操作系统以几十毫秒为单位测量时间,currentTimeMillis()方法不可能返回精确的毫秒数;而nanoTime()方法很少用,因为大部分操作系统都不支持使用纳秒作为计时单位。


除此之外,System类的in、out、err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn()、setOut()、setErr()方法来改变系统的标准输入、标准输出和标准错误输出流。


三、Process

Process类是一个抽象类,Runtime.exec()方法ProcessBuilder.start()方法都可以创建一个本机进程,并返回Process子类的一个实例,该实例可用来控制进程并获得相关信息。


Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。


ProcessImpl是Process的实现类,但是这个实现类是包级私有的,并不属于公开API的一部分,所以你在JDK帮助手册中是看不到这个类的。看一下Process定义的抽象方法:


【0018】探秘Runtime、System等系统相关类


介绍一个案例,比如打印当前计算机系统所有运行的进程,如果在DOS窗口使用tasklist命令即可查看。看一下程序实现:


【0018】探秘Runtime、System等系统相关类


采用ProcessBuilder类创建进程的方式:

【0018】探秘Runtime、System等系统相关类


在实际开发中如果要执行Java以外的程序,比如一些系统的命令,数据库的导入导出命令,文件复制命令等,可以考虑使用Process进程来完成。


四、SecurityManager

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。当前的安全管理器由System 类中的setSecurityManager 方法设置。当前的安全管理器由getSecurityManager 方法获得。


SecurityManager类经常与访问控制器(AccessController)一起使用,AccessController的核心方法有检查权限checkPermission()方法,执行授权doPrivileged()方法等。看一下安全管理器包检查方法的实现:


【0018】探秘Runtime、System等系统相关类


五、总结

简单总结一下,本文主要介绍了Java的系统相关类,比如常见的SystemRuntimeProcess等,以及安全管理器,安全管理器这部分只是简单介绍,如果要研究的话,涉及很多权限相关的类,访问控制等,有兴趣的可以去阅读源码。感谢您的阅读,谢谢。

始发于微信公众号: Java框架源码分析