啟動(dòng)類加載器(BootStrap ClassLoader)
屬于jvm自身的一部分,使用c++實(shí)現(xiàn),主要負(fù)責(zé)加載<JAVA_HOME>\lib目錄中或被-Xbootclasspath指定的路徑中的并且文件名是被虛擬機(jī)識(shí)別的文件
擴(kuò)展類加載器(Extendsion ClassLoader)
是Java實(shí)現(xiàn)的,獨(dú)立jvm,主要負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中或被java.ext.dirs系統(tǒng)變量所指定的路徑的類庫(kù)
繼承了ClassLoader
應(yīng)用程序類加載器(Application ClassLoader)
Java實(shí)現(xiàn)的,獨(dú)立于jvm,主要負(fù)責(zé)加載用戶類路徑(classPath)中的類庫(kù)
用戶自定義類加載器
Java實(shí)現(xiàn)的,獨(dú)立于jvm,可以加載我們指定位置的類庫(kù)
繼承了ClassLoader
注
繼承了ClassLoader的類加載器是無(wú)法加載全限定名以java.開頭的類的,因?yàn)槔锩孀隽税踩珯z查
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.*"
//校驗(yàn)所有以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;
}