類加載器
類加載的程序
類加載器的功能
將.class檔案【物理檔案:在硬碟中】加載到Java虛擬機的記憶體中【搬用工】,
類加載的時機情況分析:
//1,當創建Fu物件的時候【Fu.class會被加載到Java虛擬機】
Fu f = new Fu();
//2,呼叫類的靜態方法【Fu.class會被加載到Java虛擬機】(Fu.class由于在第一步已加載到虛擬機,所以在這一步不會被加載)
Fu.showMessage();
//3訪問類的靜態成員變數或者給類的靜態成員變數賦值【Fu.class會被加載到Java虛擬機】
String message = Fu.message;
Fu.message = "Hello Java";
//4,創建子類物件的時候,Fu類是Zi類的父類【Fu.class會被加載到Java虛擬機】
//5,直接基于java.exe命令運行某個類【ClassLoaderDemo1.class會被加載到虛擬機】
//6,基于反射的方式強制加載到某個類到Java虛擬機中【可以指定要加載的類的全限定名進行加載(無論是否會用到)】
Class.forName("com.yaoyao.classLoader.Fu");//【Fu.class會被加載Java虛擬機】
★:用到就加載,不用不加載,除非反射強加載
★類加載的程序細講
類加載的步驟:
(1)加載:通過創建一個位元組輸入流讀取要加載的類.class檔案到記憶體中,并且根據所讀取到的所有資訊生成一個【★.Class物件】,
Class物件中保存了類的所有資訊(構造方法+成員變數+成員方法)以及更加細致的內容(繼承誰/實行誰/構造方法的權限修飾符/成員變數的權限修飾符),
(2)驗證:驗證讀取到的資訊是否滿足Java虛擬機的規范,不影響Java虛擬機的安全,
(3)準備:給類中的靜態成員變數完成記憶體空間的分配,無論靜態變數是否有初始化值,在準備這一步只給【默認值】,
(4)決議:如果當前要加載的類中要用到其他類,將其他類也一并加載,
(5)初始化:給類的靜態變數完成初始化,如果有靜態代碼塊也在這個步驟執行,
類加載器的分類
啟動類加載器(Bootstrap ClassLoader):虛擬機內置的類加載器,
平臺類加載器(Platform ClassLoader):負責加載JDK中的一些特殊模塊,
系統類加載器(System ClassLoader):負責加載用戶路徑上所指定的類別庫,
雙親委派模型
是Java為了可以保證每一個類加載器都可以加載到自己對應的內容而設計的機制,在這種機制下沒有直接繼承
但有間接繼承

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547239.html
標籤:其他
