启动类加载器(BootStrap ClassLoader)
属于jvm自身的一部分,使用c++实现,主要负责加载<JAVA_HOME>\lib目录中或被-Xbootclasspath指定的路径中的并且文件名是被虚拟机识别的文件
扩展类加载器(Extendsion ClassLoader)
是Java实现的,独立jvm,主要负责加载<JAVA_HOME>\lib\ext目录中或被java.ext.dirs系统变量所指定的路径的类库
继承了ClassLoader
应用程序类加载器(Application ClassLoader)
Java实现的,独立于jvm,主要负责加载用户类路径(classPath)中的类库
用户自定义类加载器
Java实现的,独立于jvm,可以加载我们指定位置的类库
继承了ClassLoader
注
继承了ClassLoader的类加载器是无法加载全限定名以java.开头的类的,因为里面做了安全检查
private ProtectionDomain preDefineClass(String name,
ProtectionDomain pd)
{
if (!checkName(name))
throw new NoClassDefFoundError("IllegalName: " + name);
// Note: Checking logic in java.lang.invoke.MemberName.checkForTypeAlias
// relies on the fact that spoofing is impossible if a class has a name
// of the form "java.*"
//校验所有以java.开头的class文件抛出安全异常
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
if (pd == null) {
pd = defaultDomain;
}
if (name != null) checkCerts(name, pd.getCodeSource());
return pd;
}