1. java類加載運行過程
加載:加載字節碼文件,將類信息寫入到方法區,並生成 java.lang.Class 對象
驗證:校驗字節碼文件
準備:給靜態變量分配內存,並賦默認值
解析:將符號引用替換爲直接引用
初始化:給靜態變量賦初始化值,並執行靜態代碼塊java
2. 雙親委培機制
1) 類加載器雙親委派模型
當未指定類加載器時,jvm默認的類加載器是 AppClassLoader
優勢:a. 防止核心API被篡改,b.避免類被二次加載
2)ClassLoader 源碼
java.lang.ClassLoaderjvm
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 檢查 當前的class 是否已經被加載 Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { // 父級類加載器嘗試加載 c = parent.loadClass(name, false); } else { // 引導類加載器加載 c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { } if (c == null) { // 父類加載器未加載到時,再調用自身的findClass進行類加載 c = findClass(name); } } if (resolve) { resolveClass(c); } return c; } }