JVM类加载器
- Bootrap 启动类加载器,由C++编写,主要负责加载一些核心类库,主要是位于<JAVA_HOME>/lib/rt.jar中
- Extension 拓展类加载器, 主要加载JAVA中的一些拓展类,位于<JAVA_HOME>/lib/ext中
- System ClassLoader 系统类加载器, 主要用于加载CLASSPATH路径下我们自己写的类,是拓展类加载器的子类
- 自定义类加载器 继承java.lang.ClassLoader
如何验证类加载器
- 首先自定义一个类,通过class.forName("类全路径");
- clazz.getClassLoader() 获得类加载器
- clazz.getClassLoader().getParent() 获取父类加载器
- clazz.getClassLoader().getParent().getParent() 为null,因为启动类是C++写的,无法通过程序获取
常见问题
Object类是Bootstrap加载器加载
Extension和ClassLoader是Java.lang.ClassLoader
类加载器的三大特性
委托性:类加载时,会委托自己的父类去加载此类,如Student类会请求System ClassLoader的父类Extension扩展类加载器去加载此类,Extension扩展类加载器又会请求Bootstrap类去加载这个类。然而Bootstarp加载无法加载这个类,委托给Extension加载器,在Extension扩展类加载器无法加载时,又委托给ClassLoader加载
可见性:指的是父加载器无法利用子加载器加载的类,而子加载器可以利用父加载器加载的类。
单一性:一个类只会被加载一次,不会被重复加载