2015-05-13 51 views
3

Java標準/系統庫(java.*,javax.*等)存儲在每個JRE分佈內的lib/rt.jar中。Java在運行時如何將lib/rt.jar鏈接到您的應用程序?

假設我有一個已編譯的應用程序,jar紅色爲myapp.jar。這個JAR文件僅包含我的應用程序的類文件,而只是引用像SystemFileRuntimeThreadStringBoolean

所以,當我跑我的應用程序,比如通過java -jar myapp.jar,在JVM顯然是系統類這樣做最後一分鐘鏈接(或某事)它正在執行我的類文件的字節碼(myapp.jar內),然後「跳轉」到lib/rt.jar以運行位於那裏的字節碼。我想如果myapp.jar取決於運行時提供的其他JAR,則該過程是相同的classpath

我的問題是:這個叫做「連接」的過程是什麼,它是如何工作的?

回答

1

rt.jar是自舉類路徑中,你已經知道和您配置當您使用-cp選項(你實際上可以改變引導類路徑也使用-Xbootclasspath選項加載,例如常用的類路徑的父的一部分,一個自定義的Java運行時)。

有關如何從系統定義的類路徑層次結構搜索/加載類的detailed description的Oracle文檔。

現在,你似乎是其他問題有:

  1. 如何歸檔實際上發現

    它只是硬編碼。如果java二進制文件位於<common_root>/bin/java中,則會在<common_root>/lib/rt.jar中搜索rt.jar。

  2. 「鏈接」是如何執行的?

    在JVM上沒有實際的鏈接,使用基於ClassLoader層次結構的機制動態加載類,這些類是實際執行類文件加載/解析的軟件組件。當您嘗試加載類時,搜索將從面向應用程序的默認類加載器(或者如果您已經定義了一個子類加載器)開始,並且如果無法加載類,則加載嘗試會與父類加載器一起重複,直到引導類加載器到達。

    如果找到該類,則會加載,解析文件.class,並創建表示該類及其數據的內部結構。一旦加載該類,就可以創建一個新實例。 如果相反,即使引導類加載器無法加載您的類,也會引發用戶可見的ClassNotFoundException

相關問題