JVM 載入類遵循雙親委派模型,優先順序由高到低:
rt.jarjre/lib/ext/*.jarclasspath 指定路徑同一個類只會被載入一次,**先載入者勝出**,後續同名同包類會被忽略。
package cn.isto;
public class Jcrack {
public boolean getLogin(String pwd) { return true; } // 直接通過
}
package cn.isto;
public class Jcrack {
public boolean getLogin(String pwd) { return "KJ021320".equals(pwd); }
}
public class JMain {
public static void main(String[] args) {
System.out.println(new Jcrack().getLogin("Summer")); // false
}
}
執行 java -cp kj021320.jar:. JMain → 輸出 true!
原因:JVM 先從 kj021320.jar 載入 cn.isto.Jcrack,應用程式同名類被捨棄。
package 權限 (default) 僅對同一類載入器載入的同包類可見。Bootstrap 載入 java.lang.String,Application 載入自寫 java.lang.Test,雖同包但不同載入器,無法互訪 package 私有成員,有效防範惡意代碼竊取核心類內部狀態。
理解類載入順序與雙親委派模型,不僅能解释類衝突、熱部署、模組化等現象,更是構建安全 Java 應用的基礎。**永遠不要信任 classpath 的不可變性**,關鍵路徑務必加固。