慕碼人8056858
2021-09-15 15:21:00
我注意到我們可以隨意設置線程的上下文類加載器。這是否意味著new上下文類加載器的 loadClass 被調用的每個結果?
2 回答

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
不,loadClass()
只會在第一次訪問類時調用一次。(這不一定會發生在 上new()
,如果您嘗試訪問static
類的成員,則可能會發生這種情況。)
在該類的每次后續訪問中,loadClass()
都不會被調用。
這是因為每次需要該類時,ClassLoader 都會在findClass()
內部調用,它會嘗試查找已加載的類,因此如果該類已加載,則 ClassLoader 會避免loadClass()
再次調用。

縹緲止盈
TA貢獻2041條經驗 獲得超4個贊
類加載器的類加載可以實現為在另一個類引用它時立即加載一個類或延遲加載該類直到需要類初始化,但您應該注意,在某些情況下,行為可能與新的不完全相同,并且其他人可能也一樣。如果 Class 在實際使用之前被加載,它可以在初始化之前放在里面。這可能因JVM而異,但JLS保證在需要靜態初始化時會加載一個類。
對于給定的命名空間,類加載僅執行一次,除非相關類先前已被卸載。因此,等效表達式A.class.getClassLoader().loadClass("B's canonical name")在大多數情況下只會執行一次。換句話說,如果您有兩個表達式 - new A(),則 loadClass 將只執行一次。
添加回答
舉報
0/150
提交
取消