在Launcher类里静态属性,类加载时就会执行,就会执行对应的构造方法
private static Launcher launcher = new Launcher();
在Launcher类里面有两个静态内部类AppClassLoad(应用类加载器)和ExtClassLoad(扩展类加载器)
public Launcher() {
Launcher.ExtClassLoader var1;
try {
// 创建扩展类加载器对象
var1 = Launcher.ExtClassLoader.getExtClassLoader();
} catch (IOException var10) {
throw new InternalError("Could not create extension class loader", var10);
}
try {
// 创建应用类加载器器对象
this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
} catch (IOException var9) {
throw new InternalError("Could not create application class loader", var9);
}
// 设置当前线程的ContextClassLoader ,设置为扩展类加载器
Thread.currentThread().setContextClassLoader(this.loader);
// 如果需要安装安全管理器 security manager
String var2 = System.getProperty("java.security.manager");
if (var2 != null) {
SecurityManager var3 = null;
if (!"".equals(var2) && !"default".equals(var2)) {
try {
var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();
} catch (IllegalAccessException var5) {
} catch (InstantiationException var6) {
} catch (ClassNotFoundException var7) {
} catch (ClassCastException var8) {
}
} else {
var3 = new SecurityManager();
}
if (var3 == null) {
throw new InternalError("Could not create SecurityManager: " + var2);
}
System.setSecurityManager(var3);
}
}
查看ExtClassLoader的getExtClassLoad()
public static Launcher.ExtClassLoader getExtClassLoader() throws IOException {
if (instance == null) {
Class var0 = Launcher.ExtClassLoader.class;
synchronized(Launcher.ExtClassLoader.class) { // 加锁
if (instance == null) {
// 这里是创建对象
instance = createExtClassLoader();
}
}
}
return instance;
}
进入createExtClassLoader()
private static Launcher.ExtClassLoader createExtClassLoader() throws IOException {
try {
return (Launcher.ExtClassLoader)AccessController.doPrivileged(new PrivilegedExceptionAction<Launcher.ExtClassLoader>() {
public Launcher.ExtClassLoader run() throws IOException {
// 获取加载路径,里面是System.getProperty("java.ext.dirs");,对应的就是jre/ext下的jar文件
File[] var1 = Launcher.ExtClassLoader.getExtDirs();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
MetaIndex.registerDirectory(var1[var3]);
}
return new Launcher.ExtClassLoader(var1);
}
});
} catch (PrivilegedActionException var1) {
throw (IOException)var1.getException();
}
}
查看下AppClassLoader的创建,getAppClassLoader
public static ClassLoader getAppClassLoader(final ClassLoader var0) throws IOException {
// 加载这个路径下,对应的就是类路径下的jar文件
final String var1 = System.getProperty("java.class.path");
final File[] var2 = var1 == null ? new File[0] : Launcher.getClassPath(var1);
return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction<Launcher.AppClassLoader>() {
public Launcher.AppClassLoader run() {
URL[] var1x = var1 == null ? new URL[0] : Launcher.pathToURLs(var2);
return new Launcher.AppClassLoader(var1x, var0);
}
});
}