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只是管理程序的运行时的安全,不关心文件是否被替换。