java初始化加载类_Java 类的加载和初始化
直接從書上抄來的,自己寫一遍加深印象
類的加載
加載就是通過指定的類全限定名,獲取此類的二進制字節流(可以是clazz文件或者直接內存讀取或者遠程網絡,jar包等),然后將此二進制字節流轉化為方法區的數據結構,在內存中生成一個代表這個類的java.lang.Class對象。
java.lang.Class這個類用于維護目標類,包括讀取字段 讀取構造函數,讀取方法,創建實例(newInstance)等等。
class對象可以通過Class.forName("java.lang.String")獲取,或者直接String.class獲取,
或者"java.lang.String".getClass(),注意getClass方法是java.lang.Object中定義的,屬于native方法
定義的類不一定是第一次使用的時候的才加載也可以預先加載,java虛擬機桓范允許系統預先加載某些類。
當類被加載后,系統會生成對應的class對象,接著進入連接階段。連接階段負責把類的二進制數據合并到jre中,具體分三階段
1.驗證文件是否合法,不會危害虛擬機的安全
2.為類的變量分配內存 設置默認值
3.將類的二進制數據中的符號引用替換成直接引用
類的初始化
在初始化階段,主要對類變量執行初始化。將常量池(里面存儲了我們編寫的java類的類和接口的全限定名,字段的名稱和描述符)中的符號引用轉換為直接引用的過程。設置初始化一般有2種方法,1是聲明的時候直接賦值,2是使用靜態代碼塊
如果這個類還存在父類,那么先需要初始化直接父類,所以jvm最先初始化Object
如果類包含初始化語句則執行
什么時候會初始化?
1.創建實例 比如new 反射創建實例 反序列化等
2.調用某個類的方法(靜態的)
3.訪問某個類或接口的類變量
4.使用反射創建某個類或接口的class對象,例如class.forName("xx")
5.初始化某個類的子類 子類的所有父類都會初始化
注意一個final類型的類變量,如果編譯時就確定了具體的指,那么這個類變量相當于宏變量,編譯器會執行優化,調用這個變量的地方直接替換成該值,這個變量相當于不存在了。變量調用自然不會導致該類的初始化。
ClassLoader.loadClass()只會導致類被加載,Class.forName()才會執行類的初始化
類加載器
類加載器負責加載所有的類,系統為所有被載入內存的類生成對應的java.lang.Class實例。一個一旦被加載,則不會被再次載入了。每個被載入內存的類,都有一個唯一標識(類的全限定類名和其類加載器)
加載器規則
1.加載一個類時,該類所依賴和引用的其他類都由改類的加載器負責載入
2.如果一個類存在父類,則優先嘗試使用父類的加載器加載該類
3.所有被載入的類都會被緩存,讀取類的時候,會優先使用緩存
總結
以上是生活随笔為你收集整理的java初始化加载类_Java 类的加载和初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速去除PDF的打开密码和限制(四种方法
- 下一篇: 简单操作去除PDF文件