类加载器概述
主要的作用是将 class 文件加载到 jvm 虚拟机中。jvm 启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载。
-
隐式加载:
程序代码中不通过调用 ClassLoader 来加载需要的类,而是通过 JVM 类自动加载需要的类到内存中。例如,当我们在类中继承或者引用某个类的时候,JVM 在解析当前这个类的时,发现引用的类不在内存中,那么就会自动将这些类加载到内存中。 -
显示加载:
代码中通过 Class.forName(),this.getClass.getClassLoader.LoadClass(),自定义类加载器中的 findClass()方法等。
加载机制
Java 默认提供的三个 ClassLoader
- BootStrap ClassLoader:
主要加载 %JRE_HOME%\lib 下的 rt.jar、resources.jar、charsets.jar 和 class 等。
可以通过 System.getProperty("sun.boot.class.path")查看加载路径 - EtxClassLoader
主要加载目录 %JRE_HOME%\lib\ext 目录下的 jar 包和 class 文件。
可以通过 System.out.println(System.getProperty("java.ext.dirs"))查看加载路径 - AppClassLoader
主要加载当前应用下的 classpath 路径下的类。之前我们在环境变量中配置的 classpath 就是指定 AppClassLoader 的类加载路径。
类加载器的继承关系
双亲委派模式
双亲委派模式指 ClassLoader 会先交由父加载器加载,由上而下依次检查,如最后自己也找不到类,则抛出 ClassNotFoundException 异常
双亲委派的好处
带有层级关系,可避免重复加载
自定义类加载器
当 class 文件不在上述加载器的目录范围内是,则使用自定义加载器
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于