jvm分析:
一個java類在jvm中有三種形態:
1) source:源碼形態 ->編譯過程(javac)
2) class:字節碼形態
3)runtime:運行時形態 加載到內存,內存存在形態
jvm中最核心的一個類就是ClassLoader,從分析源碼發現該類在加載類的時候採用的雙親委派機制雙親委派:是JDK的一種安全機制,會檢測類是否被加載過,只有沒有加載過的才允許加載,父類能加載的就不給子類加載,同一時間、同一個類只允許一個線程加載到內存裏一次
該類最核心方法:
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
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) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
比如:JDK內含java.util.List類 我們自定義一個 java.util.List類,這樣的代碼能通過編譯,但是由於JDK爲保護程序運行時安全的安全機制,
不允許我們運行。但是若果我們直接更換JDK內的List類編譯後的二進制.class文件是可以執行的,黑客入侵可以通過這種方式。
文件的安全是由操作系統來保護的,JDK只是管理程序的運行時的安全,不關心文件是否被替換。