在Java开发过程中,有时候需要根据操作系统的类型,来选择执行不同的脚本或加载不同的动态库,比如 Window下的脚本是
.bat
文件,而 Linux 下的脚本是
.sh
文件,还有 Windows 下的动态库是
.dll
文件,而 Linux 下是
.so
文件。
如果想要知道当前操作系统的类型,可以通过系统属性
os.name
来判断,而系统属性具体是通过
System.getProperty(os.name)
方法获取的,下面先来分析一下
System
类中的相关源码。
1、System类源码分析
System
类位于
java.lang
包下,它是一个
final
类,也就表示该类是不能被继承的,它的类定义如下:
publicfinalclassSystem{/** Don't let anyone instantiate this class */privateSystem(){}}
其中构造函数是私有的,不能被实例化。
获取系统属性的方法是
getProperty()
,该方法有两个重载方法,如下:
public static String getProperty(String key)
:其中参数 key 就是属性名;public static String getProperty(String key, String def)
:参数 key 就是属性名,而参数 def 表示默认值,当指定属性 key 没有值时,使用默认值 def 替代。
下面分别看看这两个方法的源码:
(1)getProperty(String key)
publicstaticStringgetProperty(String key){// 检查属性名checkKey(key);// 获取安全管理器SecurityManager sm =getSecurityManager();if(sm !=null){// 检查属性访问权限
sm.checkPropertyAccess(key);}// 获取并返回属性值return props.getProperty(key);}
获取系统属性,通常会经历三个步骤:
- 检查属性名是否为空
- 检查属性访问权限
- 获取属性值
其中
checkKey()
方法源码如下:
privatestaticvoidcheckKey(String key){if(key ==null){thrownewNullPointerException("key can't be null");}if(key.equals("")){thrownewIllegalArgumentException("key can't be empty");}}
该方法主要判断属性名是否为 null 或者为空字符串,如果为 null ,则会抛出
NullPointerException
异常,如果为空字符串,则会抛出
IllegalArgumentException
异常。
SecurityManager
是安全管理器,用于实现安全策略的类,检查应用程序是否具有某些操作的权限,最终会调用
AccessControlContext
类的
checkPermission()
方法,如果应用程序没有操作权限,则会抛出
AccessControlException
异常。
最终属性值的获取是通过
Properties
类的
getProperty()
方法获取的,所有的系统属性都会保存在
Properties
实例中,由JVM进行初始化,其定义如下:
privatestaticProperties props;privatestaticnativePropertiesinitProperties(Properties props);
而
initProperties()
方法又是在
initializeSystemClass()
方法中调用的,源码如下:
privatestaticvoidinitializeSystemClass(){
props =newProperties();initProperties(props);// initialized by the VM//....}
关于
Properties
类的
getProperty()
方法定义如下:
publicStringgetProperty(String key){Object oval =super.get(key);String sval =(oval instanceofString)?(String)oval :null;return((sval ==null)&&(defaults !=null))? defaults.getProperty(key): sval;}
(2)getProperty(String key, String def)
publicstaticStringgetProperty(String key,String def){checkKey(key);SecurityManager sm =getSecurityManager();if(sm !=null){
sm.checkPropertyAccess(key);}return props.getProperty(key, def);}
该方法和上一个方法的区别在于它可以设置一个默认值,当属性值不存在时,则会使用默认值替代,调用的是
Properties
的
getProperty(String key, String defaultValue)
方法,其定义如下:
publicStringgetProperty(String key,String defaultValue){// 首先获取属性值String val =getProperty(key);// 如果属性值为 null,则返回默认值return(val ==null)? defaultValue : val;}
2、代码实现
packagecom.magic.system;publicclassSystemUtils{/**
* 判断操作系统是否是 Windows
*
* @return true:操作系统是 Windows
* false:其它操作系统
*/publicstaticbooleanisWindows(){String osName =getOsName();return osName !=null&& osName.startsWith("Windows");}/**
* 判断操作系统是否是 MacOS
*
* @return true:操作系统是 MacOS
* false:其它操作系统
*/publicstaticbooleanisMacOs(){String osName =getOsName();return osName !=null&& osName.startsWith("Mac");}/**
* 判断操作系统是否是 Linux
*
* @return true:操作系统是 Linux
* false:其它操作系统
*/publicstaticbooleanisLinux(){String osName =getOsName();return(osName !=null&& osName.startsWith("Linux"))||(!isWindows()&&!isMacOs());}/**
* 获取操作系统名称
* @return os.name 属性值
*/publicstaticStringgetOsName(){returnSystem.getProperty("os.name");}}
3、测试验证
测试验证代码如下:
publicstaticvoidmain(String[] args){System.out.println("os.name : "+getOsName());System.out.println("isWindows : "+isWindows());System.out.println("isLinux : "+isLinux());System.out.println("isMacOs : "+isMacOs());}
在 Windows 10 系统环境下运行,输出结果如下:
os.name :Windows10
isWindows :true
isLinux :false
isMacOs :false
在 CentOS 7 系统环境下运行,输出结果如下:
os.name :Linux
isWindows :false
isLinux :true
isMacOs :false
版权归原作者 然笑后端 所有, 如有侵权,请联系我们删除。