在JAVA運行的時加載jar包類庫 要是有相同的包路徑,相同的類名字出現,那麼JVM是否 會報告錯誤呢?
當然不會! JVM只會加載最早的出現的CLASS
首先JVM會加載 自己默認的包 然後加載 EXT目錄下面的所有JAR 再到 classpath
那麼 現在有2個 JAR 分別是 kj021320.jar summer.jar 裡面都有包路徑cn.isto
同樣有 類Jcrack.class 那麼 JVM就會看哪個 類先加載到VM中就用哪個!後面讀進來的 如果路徑名字一樣 就會丟棄!
想到以上加載方式大家會想象到什麼呢?
我們首先設計一個類
//這個是專門破解的類
package cn.isto;
public class Jcrack{
public Jcrack(){}
boolean getLogin(String pwd){
return true;
}
}
裡面只有一個方法判斷 登陸是否成功 直接返回一個true
把這個類打包為 kj021320.jar
下面我們再來寫2個類
//這個是真正運行時候判斷登陸的類
package cn.isto;
public class Jcrack {
public Jcrack() {
}
boolean getLogin(String pwd){
return "KJ021320".equals(pwd);
}
}
//調用登陸驗證的類
package cn.isto;
public class JMain {
public JMain() {
}
public static void main(String[] args){
System.out.println(new Jcrack().getLogin("Summer"));
}
}
很明顯我們把上面2個類編譯OK後 直接運行! 不用看控制台都會打印false
然而我們再把上面kj021320.jar加載回來再運行 JMain類
系統就會顯示true 簡單說因為 JVM把正常用戶的Jcrack類拋棄了!而加載了我們自己修改的Jcrack類!
JAVA應用就這樣簡單破解了!