JDK1.8源码解读之 System

311 阅读4分钟

概述

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

继承关系

public final class System final 类 无法被继承

关键方法

setIn()

重新分配标准输入流。首先,如果有安全管理器,checkPermission方法会被调用,去确认时候可以重新分配标准输入流。

public static void setIn(InputStream in)
setOut()

重新分配标准输出流。首先,如果有安全管理器,它的checkPermission方法会被调用,去确认是否可以可重新分配标准输出流。

public static void setOut(PrintStream out)
setErr()

重新分配标准错误输出流。首先,如果有安全管理器,它的checkPermission方法会被调用,去确认是否可以可重新分配标准输出流。

public static void setErr(PrintStream err)
console()

返回和当前java虚拟机相关的console对象。

public static Console console()
inheritedChannel()

返回一个通道,该通道继承自 创建Java虚拟机的实体

public static Channel inheritedChannel() throws IOException
setSecurityManager()

设置系统的安全管理器。如果已经安装了一个安全管理器,该方法会调用安全管理器的checkPermission方法去确认是否可以替换现有的安全管理器。

public static void setSecurityManager(final SecurityManager s)
setSecurityManager()

获取系统的安全管理器

public static void getSecurityManager(final SecurityManager s)
currentTimeMillis()

返回当前时间,以毫秒格式

public static native long currentTimeMillis();
nanoTime()

返回当前java虚拟机的高分辨率的时间。以纳秒为单位。

public static native long nanoTime();
arraycopy()

复制数组,从源数组src位置srcPos开始,复制到目标数组dest,从destPos开始,length的长度。

public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos,int length);
getProperties()

获取系统变量。

public static Properties getProperties()
lineSeparator()

在unix系统中返回"\n" 在windows系统中返回"\r\n"

public static String lineSeparator() {
    return lineSeparator;
}
setProperties()

设置系统变量。

public static void setProperties(Properties props)
getProperty()

根据名称获取系统变量。

public static String getProperty(String key)

根据名称获取系统变量。找不到就返回def。

public static String getProperty(String key, String def)
setProperty()

设置系统变量

public static String setProperty(String key, String value)
clearProperty()

清除系统变量。

public static String clearProperty(String key)
getenv()

获取指定环境变量的值。环境变量是与系统有关的外部命名值。 如果存在安全管理器,则使用 RuntimePermission来调用其checkPermission方法。 这可能会导致引发 SecurityException 。 如果没有抛出异常,则返回变量name的值。 系统属性和环境变量在概念上都是名称和值之间的映射。 两种机制都可以用于将用户定义的信息传递给Java进程。 环境变量具有更广泛的影响,因为它们对定义它们的进程的所有后代都是可见的,而不仅仅是直接Java子进程可见。 它们在不同的操作系统上可以具有微妙的语义,例如不区分大小写。 由于这些原因,环境变量更有可能产生意想不到的副作用。 最好在可能的情况下使用系统属性。 当需要全局效果或外部系统接口需要环境变量(例如PATH)时,应使用环境变量。 在UNIX系统上,名称的字母大小写通常很重要,而在Microsoft Windows系统上,名称的字母大小写通常不重要。例如,在Microsoft Windows上,表达式System.getenv("FOO").equals(System.getenv("foo"))可能为true。

public static String getenv(String name)
public static java.util.Map<String,String> getenv()
exit()

终止java虚拟机的运行。

public static void exit(int status) {
    Runtime.getRuntime().exit(status);
}
gc()

运行垃圾回收

public static void gc() {
    Runtime.getRuntime().gc();
}
runFinalization()
public static void runFinalization() {
    Runtime.getRuntime().runFinalization();
}
load()

按照指定的文件名,加载指定的类库。

@CallerSensitive
public static void load(String filename) {
    Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
}
loadLibrary()

按照libname参数,加载指定的本地库。libname参数不能包含任何 特定平台的前缀,文件扩展名或者路径。

@CallerSensitive
public static void loadLibrary(String libname) {
    Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
}
mapLibraryName()

将一个库的名称映射到一个 指定平台的 代表本地库的字符串

public static native String mapLibraryName(String libname);

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。