文章目录
概念
Java类加载器是JRE的一部分,负责动态加载Java类到JVM的内存空间中
Java默认有三种类加载器:
- BootstrapClassLoader,BootstrapClassLoader(引导启动类加载器):嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,引导启动类加载器无法被应用程序直接使用
- ExtensionClassLoader,ExtensionClassLoader(扩展类加载器):ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap。 是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。它的父加载器是BootstrapClassLoader
- App ClassLoader,App ClassLoader(应用类加载器):App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader
类在内存中只会被加载一次,这是因为类加载器使用了双亲委派模型
双亲委派模型:当一个类加载器遇到类的加载请求,它不会自己加载这个类,而是把请求发送给父类加载器,如果这个类是父类已经加载过的,可以直接进行使用,只有当父类反馈自己无法完成加载请求的时候,类加载器才会进行加载,保证类不会被重复加载
除了保证类只被加载一次以外,双亲委派模型还可以保护Java核心类库不被污染,即使有程序员自己编写了一个String类,在加载时,类加载器也会先请求父类加载,这样会找到BootStrap Class Loader已经加载好的jar包的String类,而不是人为污染的String类
Object o = new Object();
Demo1 demo1 = new Demo1();
system.out.println(o.getClass().getClassLoader());
system.out.println(demo1.getClass().getClassLoader().getParent().getParent());
以上代码输出的结果皆为null,因为java触碰不到c语言编写的BootstrapClassLoader