您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關jvm中怎么加載一個類,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
第一步:加載,雙親委派:啟動類加載器(jre/lib),系統擴展類加載器(ext/lib),應用類加載器(classpath),前者為c++編寫,所以系統加載器的parent為空,后面兩個類加載器都是通過啟動類加載器加載完成后才能使用。加載的過程就是查找字節流,可以通過網絡,也可以自己在代碼生成,也可以來源一個jar包。另外,同一個類,被不同的類加載器加載,那么他們將不是同一個類,java中通過類加載器和類的名稱來界定唯一,所以我們可以在一個應用成存在多個同名的類的不同實現。
第二步:鏈接:(驗證,準備,解析) 驗證主要是校驗字節碼是否符合約束條件,一般在字節碼注入的時候關注的比較多。準備:給靜態字段分配內存,但是不會初始化,解析主要是為了將符號引用轉換為實際引用,可能會觸發方法中引用的類的加載。
第三步:初始化,如果賦值的靜態變量是基礎類型或者字符串并且是final的話,該字段將被標記為常量池字段,另外靜態變量的賦值和靜態代碼塊,將被放在一個叫cinit的方法內被執行,為了保證cinit方法只會被執行一次,這個方法會加鎖,我們一般實現單例模式的時候為保證線程安全,會利用類的初始化上的鎖。 初始化只有在特定條件下才會被觸發,例如new 一個對象,反射被調用,靜態方法被調用等。
關于jvm中怎么加載一個類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。