前情提要
在前面已经介绍过 System与initializeSystemClass 在此不做过多解释,没有看到的希望去查看!
System源码浅析- initializeSystemClass(initProperties)
System源码浅析- initializeSystemClass(saveAndRemoveProperties)
System源码浅析- initializeSystemClass(setXXX0)
System源码浅析- initializeSystemClass(loadLibrary)
System源码浅析- initializeSystemClass(setup)
System源码浅析- initializeSystemClass( initializeOSEnvironment )
System源码浅析- initializeSystemClass( setJavaLangAccess)
System
描述
System 类包含几个有用的类字段和方法。它不能被实例化。
System 类提供的设施包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;
一种加载文件和库的方法;以及一种用于快速复制数组的一部分的实用方法。
initializeSystemClass
描述
// VM 可能会在“props”初始化期间调用 JNU_NewStringPlatform() 来设置那些编码
// 敏感属性(user.home、user.name、boot.class.path 等),
// 在这些属性中它可能需要通过 System.getProperty() 访问,
// 在初始化的早期阶段已经初始化(放入“props”)的相关系统编码属性。
// 因此,请确保“props”在初始化的一开始就可用,并且所有系统属性都可以直接放入其中。
/**
* 初始化系统类。在线程初始化后调用。
*/
private static void initializeSystemClass() {
// VM 可能会在“props”初始化期间调用 JNU_NewStringPlatform() 来设置那些编码
// 敏感属性(user.home、user.name、boot.class.path 等),
// 在这些属性中它可能需要通过 System.getProperty() 访问,
// 在初始化的早期阶段已经初始化(放入“props”)的相关系统编码属性。
// 因此,请确保“props”在初始化的一开始就可用,并且所有系统属性都可以直接放入其中。
props = new Properties();
initProperties(props); // initialized by the VM
// 某些系统配置可能由 VM 选项控制,例如用于支持自动装箱的对象标识语义的最大直接内存量和整数缓存大小。
// 通常,库将从 VM 设置的属性中获取这些值。如果属性仅供内部实现使用,
// 则应从系统属性中删除这些属性。
//
// 例如,参见 java.lang.Integer.IntegerCache 和 sun.misc.VM.saveAndRemoveProperties 方法。
//
// 保存只能由内部实现访问的系统属性对象的私有副本。删除某些不打算供公众访问的系统属性。
sun.misc.VM.saveAndRemoveProperties(props);
lineSeparator = props.getProperty("line.separator");
sun.misc.Version.init();
// 文件流
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));
// 现在加载 zip 库,以防止 java.util.zip.ZipFile 稍后尝试使用自身加载此库。
loadLibrary("zip");
// 为 HUP、TERM 和 INT(如果可用)设置 Java 信号处理程序。
Terminator.setup();
// 初始化需要为类库设置的任何其他操作系统设置。
// 目前,除了在使用 java.io 类之前设置了进程范围的错误模式的 Windows 之外,
// 这在任何地方都是无操作的。
sun.misc.VM.initializeOSEnvironment();
// 主线程不像其他线程那样添加到它的线程组中;我们必须在这里自己做。
Thread current = Thread.currentThread();
current.getThreadGroup().add(current);
// 注册共享秘密
setJavaLangAccess();
// 在初始化期间调用的子系统可以调用 sun.misc.VM.isBooted() 以避免执行应该等到应用程序类加载器设置完成的事情。
// 重要提示:确保这仍然是最后的初始化操作!
sun.misc.VM.booted();