十分鐘速懂java知識(shí)點(diǎn) System類(lèi)
上次面試中遇到的一個(gè)問(wèn)題,問(wèn)到System.out.println()中的out是不是內(nèi)部類(lèi),當(dāng)時(shí)就給問(wèn)蒙了,直觀(guān)感覺(jué)out應(yīng)該是System類(lèi)的一個(gè)屬性,跟內(nèi)部類(lèi)有什么關(guān)系?而且之前整理IO部分的時(shí)候記得有個(gè)PrintStream的類(lèi)用于標(biāo)準(zhǔn)輸出的,但是從沒(méi)看過(guò)System的源碼,也不敢隨便再說(shuō)了。后來(lái)看了下源碼,發(fā)現(xiàn)的確是PrintStream,可能當(dāng)時(shí)想問(wèn)的是內(nèi)部類(lèi)的用法吧,不過(guò)歸根結(jié)底自己水平差得多,還是要認(rèn)真學(xué)習(xí)。
言歸正傳,System類(lèi)是jdk提供的一個(gè)工具類(lèi),有final修飾,不可繼承,由名字可以看出來(lái),其中的操作多數(shù)和系統(tǒng)相關(guān)。其功能主要如下:
- 標(biāo)準(zhǔn)輸入輸出,如out、in、err
- 外部定義的屬性和環(huán)境變量的訪(fǎng)問(wèn),如getenv()/setenv()和getProperties()/setProperties()
- 加載文件和類(lèi)庫(kù)的方法,如load()和loadLibrary()、
- 一個(gè)快速拷貝數(shù)組的方法:arraycopy()
- 一些jvm操作,如gc()、runFinalization()、exit(),該部分并未在源碼的java doc中提到,可能因?yàn)楸旧聿唤ㄗh主動(dòng)調(diào)用吧。而且這幾個(gè)方法都僅僅是Runtime.getRuntime()的調(diào)用,兩者沒(méi)有區(qū)別
下邊直接看圖,主要的方法和功能都已經(jīng)列出來(lái)。
下邊我們重點(diǎn)來(lái)該類(lèi)是如何初始化的。
首先在開(kāi)頭我們就可以看如下代碼:
private static native void registerNatives(); static { registerNatives(); }
類(lèi)中的靜態(tài)代碼塊調(diào)用了一個(gè)native方法registerNatives(),可以猜到該方法應(yīng)該是一個(gè)入口方法,看一下注釋?zhuān)和ㄟ^(guò)靜態(tài)初始化注冊(cè)native方法,該方法會(huì)令vm通過(guò)調(diào)用initializeSystemClass方法來(lái)完成初始化工作。果然如此,那么接下來(lái)我們看下initializeSystemClass方法吧:
private static void initializeSystemClass() { // 初始化props props = new Properties(); initProperties(props); sun.misc.VM.saveAndRemoveProperties(props); //獲取系統(tǒng)相關(guān)的換行符 lineSeparator = props.getProperty("line.separator"); sun.misc.Version.init(); //分別創(chuàng)建in、out、err的實(shí)例對(duì)象,并通過(guò)setXX0()初始化,查看setXX0()方法可知,這是個(gè)native方法,將系統(tǒng)的標(biāo)準(zhǔn)流管理到類(lèi)內(nèi)的對(duì)象 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這個(gè)類(lèi),以便之后加載利庫(kù)使用 loadLibrary("zip"); // 設(shè)置平臺(tái)相關(guān)的信號(hào)處理 Terminator.setup(); // 初始化sun.misc相關(guān)的環(huán)境變量 sun.misc.VM.initializeOSEnvironment(); // 主線(xiàn)程不會(huì)在同一個(gè)線(xiàn)程組中添加相同的線(xiàn)程,我們必須在這里自己實(shí)現(xiàn)。注釋半天沒(méi)弄明白,看代碼就是主線(xiàn)程自己把自己加到了自己的線(xiàn)程組中...... Thread current = Thread.currentThread(); current.getThreadGroup().add(current); // 注冊(cè)共享秘鑰?注釋沒(méi)看明白,該方法就是實(shí)例化一個(gè)JavaLangAccess setJavaLangAccess(); // 子系統(tǒng)在初始化的時(shí)候可以調(diào)用sun.misc.VM.isBooted(),以保證在application類(lèi)加載器啟動(dòng)前不做任何事。booted()其實(shí)就是改了個(gè)狀態(tài),使isBooted()變?yōu)閠rue。 sun.misc.VM.booted(); }
至此,System基本上便講完了,希望本文所述對(duì)大家學(xué)習(xí)有所幫助。
相關(guān)文章
Java GUI編程實(shí)現(xiàn)在線(xiàn)聊天室
這篇文章主要為大家詳細(xì)介紹了Java GUI編程實(shí)現(xiàn)在線(xiàn)聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-0730條Java代碼編寫(xiě)經(jīng)驗(yàn)分享
你知道寫(xiě)好Java代碼的30條經(jīng)驗(yàn)是什么嗎?這篇文章主要為大家分享了30條Java代碼編寫(xiě)經(jīng)驗(yàn)技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理
實(shí)際項(xiàng)目開(kāi)發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)傳遞機(jī)制的相關(guān)資料,需要的朋友可以參考下2023-03-03詳解解密Java中的類(lèi)型轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了Java中的類(lèi)型轉(zhuǎn)換問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03MybatisPlus批量保存原理及失效原因排查全過(guò)程
這篇文章主要介紹了MybatisPlus批量保存原理及失效原因排查全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01如何利用Java?AWT?創(chuàng)建一個(gè)簡(jiǎn)易計(jì)算器
這篇文章主要介紹了如何利用Java?AWT?創(chuàng)建一個(gè)簡(jiǎn)易計(jì)算器,AWT?是一個(gè)有助于構(gòu)建?GUI?的?API?基于?java?應(yīng)用程序,下面關(guān)于其相關(guān)資料實(shí)現(xiàn)計(jì)算器的內(nèi)容詳細(xì),需要的朋友可以參考一下2022-03-03深入理解MyBatis中的一級(jí)緩存與二級(jí)緩存
這篇文章主要給大家深入的介紹了關(guān)于MyBatis中一級(jí)緩存與二級(jí)緩存的相關(guān)資料,文中詳細(xì)介紹MyBatis中一級(jí)緩存與二級(jí)緩存的工作原理及使用,對(duì)大家具有一定的參考性學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06