1.JVM模型图如下
2.双亲委派机制
双亲委派机制存在于类加载器中,JVM在初始化的时候,会将类模板、即.class文件加载进方法区中,例如String类,Object类等等。加载器调用的顺序如下
在加载类的时候,会逐层的先上委托,让自己的上一级先去加载这个类。为什么引入这样的机制呢?假设我们自行编写另一个String类。并且包名也和JAVA中的一样,并且也使用这个String进行开发,在编译的时候,我们知道,由于存在双亲委派机制,加载进JVM中的String类不会是我们编写的那个类,而是由引导类加载器加载进来的JAVA自带的String类,因为String类属于JAVA中已经存在的基本类。这样做的目的就是为了
- 防止重复加载同一个类模板信息。
- 保证核心类模板不能被篡改。
3.获取类加载器
如何知道我们的类是由那个加载器加载的呢?
public class Demo {
public static void main(String[] args) throws Exception {
//获取Class的3种方式
//1 类名.class
ClassLoader classLoader1 = String.class.getClassLoader();
//2 Class.forName('全路径包名')
ClassLoader classLoader2 = Class.forName("java.lang.String").getClassLoader();
//3 对象.getClass()
Demo demo = new Demo();
ClassLoader classLoader3 = demo.getClass().getClassLoader();
System.out.println(classLoader1);
System.out.println(classLoader2);
System.out.println(classLoader3);
}
}
结果如下:
null
null
sun.misc.Launcher$AppClassLoader@18b4aac2
我们知道,String的类加载器应该是BootstrapClassLoader,为什么打印出null呢?因为BootstrapClassLoader是由C++实现的,java无法获取详细信息,就好像String无法干扰native方法一样
版权声明:本文为BrotherJinJin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。