作者:田超凡
原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂
将Java文件编译后生成的class文件读取到内存中
类加载器加载我们的class文件,并且经历过验证、准备、解析,在初始化我们该类。
1.本地磁盘文件 java源代码编译的class文件
2.通过网络下载的class文件
3.War、Jar包解压的class文件
4.从专门的数据库中读取的class文件
5.使用java cglib、jdk动态代理(JavaCompile)生成的代理类class文件
Jvm虚拟机中,通过类加载器(用户可以自定义类加载器)来加载class文件到内存中
底层是基于C语言实现,是最底层的类加载器实现。
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);
}
// 当前程序启动的线程 默认的 ClassLoader 应用类加载器
Thread.currentThread().setContextClassLoader(this.loader);
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); |
类的主动使用:
小结:
初始化一个类的时候,那么一定会触发类加载器。
但是类加载器加载了一个类,该类却不一定被初始化。