首頁  >  文章  >  Java  >  詳解Java中的System類

詳解Java中的System類

Y2J
Y2J原創
2017-05-04 09:45:262349瀏覽

System類是jdk提供的工具類,有final修飾,不可繼承,由名字可以看出來,其中的運算多數和系統相關。這篇文章主要介紹了Java System類詳解_動力節點Java學院整理,需要的朋友可以參考下

System類是jdk提供的一個工具類,有final修飾,不可繼承,由名字可以看出來,其中的操作多數和系統相關。其功能主要如下:

• 標準輸入輸出,如out、in、err

• 外部定義的屬性和環境變數的訪問,如getenv()/setenv()和getProperties()/setProperties()

• 載入檔案和類別庫的方法,如load()和loadLibrary()、

• 一個快速拷貝數組的方法:arraycopy()

• 一些jvm操作,如gc()、runFinalization()、exit(),該部分並未在原始碼的java doc中提到,可能因為本身不建議主動呼叫吧。而且這幾個方法都只是Runtime.getRuntime()的調用,兩者沒有區別 下邊直接看圖,主要的方法和功能都已經列出來。

 下邊我們重點來該類別是如何初始化的。 首先在開頭我們就可以看如下程式碼:

private static native void registerNatives();
static {
 registerNatives();
}

類別中的靜態程式碼區塊呼叫了一個native方法registerNatives(),可以猜到該方法應該是一個入口方法,看一下註解:透過靜態初始化註冊native方法,該方法會令vm透過呼叫initializeSystemClass方法來完成初始化工作。果然如此,那麼接下來我們來看initializeSystemClass方法吧:

private static void initializeSystemClass() {
  // 初始化props
  props = new Properties();
  initProperties(props); 
  sun.misc.VM.saveAndRemoveProperties(props);
  //获取系统相关的换行符
  lineSeparator = props.getProperty("line.separator");
  sun.misc.Version.init();
  //分别创建in、out、err的实例对象,并通过setXX0()初始化,查看setXX0()方法可知,这是个native方法,将系统的标准流管理到类内的对象
  FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
  FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
  FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
  setIn0(new BufferedInputStream(fdIn));
  setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
  setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
  //加载zip包以获取java.util.zip.ZipFile这个类,以便之后加载利库使用
  loadLibrary("zip");
  // 设置平台相关的信号处理
  Terminator.setup();
  // 初始化sun.misc相关的环境变量
  sun.misc.VM.initializeOSEnvironment();
  // 主线程不会在同一个线程组中添加相同的线程,我们必须在这里自己实现。注释半天没弄明白,看代码就是主线程自己把自己加到了自己的线程组中......
  Thread current = Thread.currentThread();
  current.getThreadGroup().add(current);
  // 注册共享秘钥?注释没看明白,该方法就是实例化一个JavaLangAccess
  setJavaLangAccess();
  // 子系统在初始化的时候可以调用sun.misc.VM.isBooted(),以保证在application类加载器启动前不做任何事。booted()其实就是改了个状态,使isBooted()变为true。
  sun.misc.VM.booted();
}

以上是詳解Java中的System類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn