类加载器就像搬运工,把.class 文件搬进 jvm 里。
类加载器
jvm 内置三个 classLoader,除了 bootstrapClassLoader 其余类加载器由 java 实现,并继承自 java.lang.classloader
- bootstrapClassLoader:启动类加载器,c++ 实现,最顶层的加载类,负责加载 javahome/bin 目录下的 jar 包或者被 -xbootclasspath 参数指定的门路中的所有类。
- extensionClassLoader: 负责加载 jreHome/lib/ext 目录下的 jar 包,或被 java.ext.dirs 零碎变量指定的门路下的 jar 包
- appClassLoader:应用程序类加载器,负责加载以后利用 classpath 下的 jar 包。
双亲委派模型
每个类都有对应的类加载器。
类加载时,会先判断以后类是否被加载过,已加载过的类会间接返回,没加载过会判断其父类是否加载过。齐全没加载过,会先委派父类的加载器解决,父类加载器解决不了才会由本人解决。
因而所有的申请最终都传送到 bootStrapClassLoader 中。
当父类加载器为 null 时,会应用 bootStrapClassLoader 作为加载器。
双亲委派模型的益处
能够防止类反复加载。因为雷同的类被不同的加载器加载产生的是两个不同的类。