最近,我被一位計算機科學專家問到,要描述Java中的類加載器。我向他解釋了3個類加載器,即「BootStrap CL」,「Extension CL」和「Application CL」,我也向他解釋了「解析算法」。接下來,他要求我證明這一點,任何人都可以給我一個代碼來實際看到執行中的類加載器?如何知道哪些類正在通過哪些類加載程序在Java中加載?
回答
有幾個方法,你可以去了解這一點:
表明,不同類別有不同的
ClassLoader
對象。例如,YourMainClass.class.getClassLoader()
可能是sun.misc.Launcher$AppClassLoader
,而System.class.getClassLoader()
爲空(與其他系統類一樣)。這裏是一個快速測試:從JAR- 類:[email protected]
- 主類:[email protected]
java.lang.System
的類加載器:空- 系統類裝載器:[email protected]
- 系統類加載器的父:[email protected]
- 主類的類加載器的父:[email protected] 298b7
- 罐類加載器的父:[email protected]
父類加載器以下列方式使用:
- 類加載器臨危加載一個類的請求。如果它已經加載,它會返回它。
- 該類加載器首先要求其父代加載它。如果父代不能加載它,那麼該類加載器自己加載並返回它。
顯示OpenJDK源代碼及其多個ClassLoader。
描述在真實世界中發生這種情況的應用程序。您可以討論在運行時定義類的腳本引擎,servlet容器,特定的構建系統等。
Null指的是什麼?這是否意味着Bootstrap Class Loader會加載預定義的類,但是由於Bootstrap Class Loader是使用Native語言而不是java,而其他2類是Java類,因此它會將輸出設置爲null,而其他2則會給出輸出assun.misc.Launcher $ ApplicationClassLoader ? –
以及如何測試擴展類加載器? –
@Milind是的,這似乎是正確的。引導類加載器似乎沒有'ClassLoader'對象,而是JVM的本機代碼的一部分。它不能用Java編寫,因爲那時將不會有類加載器加載它及其依賴關係。 – hexafraction
- 1. 哪些Java類正在我的程序在運行時加載?
- 2. 哪些包在Java中自動加載?
- 3. 如何檢查應用程序加載時正在加載哪些資源?
- 4. Linux內核如何知道在啓動時加載哪些驅動程序?
- 5. iphone - 如何知道哪些視圖當前加載在tabBar應用程序?
- 6. 發現哪些程序集正在加載哪些依賴關係(運行時)
- 7. 如何查看在.Net中加載了哪些類
- 8. 如何研究從哪個JAR加載哪些類?
- 9. 如何知道由LoadLibrary加載哪些依賴關係?
- 10. 在哪些情況下需要遠程類加載?
- 11. 在div中加載了哪些頁面
- 12. 如何知道在一個類中定義了哪些變量
- 13. 我如何知道在project.json中添加了哪些導入?
- 14. 知道哪個Mac進程正在加載我的庫框架
- 15. Java類加載 - 哪個類加載器和/或類導致加載?
- 16. 如何知道在Android應用程序中使用哪些庫
- 17. 如何查看哪些資源緩慢加載網頁加載
- 18. 如何跟蹤應用程序動態加載哪些庫?
- 19. 如何知道java程序需要運行哪些jar文件?
- 20. 試圖從一個類加載類的小程序在哪裏?
- 21. 如何知道哪些應用程序在後臺運行
- 22. 如何知道哪些應用程序在Linux
- 23. 通過apache檢查Perl正在使用哪些可加載核心模塊?
- 24. 如何查找哪些包在Emacs中加載緩慢?
- 25. GWT - 代碼拆分 - GWT如何知道首次加載哪些數據?
- 26. 如何知道.jar文件中的哪些類被引用?
- 27. 如何知道某個類中包含了哪些模塊
- 28. 如何知道哪些程序正在服務層或框架中運行
- 29. 是否有可能知道哪些java類正在做磁盤IO操作
- 30. 如何知道哪些函數重載GCC選擇
如果您不想回答,則不需要downvote。你沒有被迫回答。 。轉向其他一些問題! –