JAVA 類加載方式(loadClass、forName)

Java的兩種類加載方式

一 :隱式加載

通過直接new對象的方式加載,再java運行過程中發現new關鍵字,會隱式調用類加載器。這種方式可以調用類的空參和帶參構造

二 :顯示加載

通過loadClassforName這種加載方式需要通過newInstance方法生成對象的實例,這種方式不能調用帶參構造,調用帶參構造需要反射調用newInstance方法

loadClass和forName的區別

首先了解一下類裝載的過程

1 加載 將類的class字節碼文件生成class對象
2 連接

連接分三步
1 校驗 驗證字節碼文件的安全性
2 準備 爲類變量分配內存空間 並設置初始值 類變量隨類型信息存放在方法區中
3 解析 JVM常量池內符號引用轉化爲直接引用

3 初始化 執行類變量賦值 和靜態代碼塊

LoadClass源碼

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
傳入的是fasle 裏面調用的resolveClass是不會執行的 我們進入看看這個方法的作用
在這裏插入圖片描述
這個方法是用來確認是否連接這個類的 默認是false說明 loadClass得到的class對象只完成了類裝載過程的第一步加載

我們舉個例子

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
也就是說forName會執行Static代碼 表示forName他會初始化我們這個類

forName源碼

在這裏插入圖片描述
我們找到forName的重載方法 在這裏插入圖片描述

forName得到的class是已經完成初始化的

是否在類裝載的時候連接是通過initialize屬性 默認是true

loadClass得到的class是還沒有完成連接的

是否連接通過resolveClass 屬性 默認false

列舉一個forName的使用場景

連接MySQL數據庫時
在這裏插入圖片描述在這裏插入圖片描述
這個driver他返回Driver對象是靠裏面的靜態代碼塊的 因此呢 如果使用ClassLoader 是不行的 需要用forName

loadClass場景

在SpringIOC中,在資源加載器獲取要讀入的資源的時候以及讀取一些bean的配置的時候,是以classpath的方式加載 需要使用ClassLoader.loadClass 方法 。
之所以這樣做是和SpringIOC的lazyLoad有關 SpringIOC爲了提高加載速度,因此大量使用了延遲加載技術,而使用ClassLoader不需要執行類中的初始化代碼 還有連接等步驟,這樣做可以加快加載速度,把了類的初始化工作留到類實際使用的時候再去完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章