参考大佬地址:
https://zhuanlan.zhihu.com/p/51374915 //重点看这篇
https://blog.csdn.net/briblue/article/details/54973413
个人研究部分ClassLoader源码如下:
ClassLoader这个类源码解析(源代码如下):
首先我们看下默认构造函数:
//这是默认的构造器
protected ClassLoader() {
this(checkCreateClassLoader(), getSystemClassLoader());
}
然后我们进入getSystemClassLoader()方法 代码如下:
public static ClassLoader getSystemClassLoader() {
initSystemClassLoader(); //这个是非常关键的 获取ClassLoader类
if (scl == null) {
return null;
}
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
checkClassLoaderPermission(scl, Reflection.getCallerClass());
}
return scl;
}
紧接着我们进入initSystemClassLoader我们翻开代码如下(私有的同步的静态方法):
private static synchronized void initSystemClassLoader() {
if (!sclSet) { //如果sclSet==false
if (scl != null)
throw new IllegalStateException("recursive invocation");
sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); //首先获取Laucher 这个就是获取外部类Launcher实例,通过这个实例来获取AppClassLoader内部类的实例
if (l != null) {
Throwable oops = null;
scl = l.getClassLoader();// 原来是在这里获取ClassLoader实例的
try {
scl = AccessController.doPrivileged(
new SystemClassLoaderAction(scl));
} catch (PrivilegedActionException pae) {
oops = pae.getCause();
if (oops instanceof InvocationTargetException) {
oops = oops.getCause();
}
}
if (oops != null) {
if (oops instanceof Error) {
throw (Error) oops;
} else {
// wrap the exception
throw new Error(oops);
}
}
}
sclSet = true;
}
}
总结:就是默认构建ClassLoader的实例的时候 从默认构造器里面获取了AppClassLoader的实例 它是通过
getSystemClassLoader方法来获取实例