Java类加载的过程
-
加载:只有使用的类才会被加载例如调用Main方法或者new对象等等。这个阶段会把类的字节码文件读取到JVM虚拟机中然后生成对应的java.lang.Class对象,作为这个类的访问入口。
-
验证:校验字节码的文件的正确性。
-
准备:给类的静态变量初始化内存,并赋予默认值。
-
解析:将符号引用替换成直接引用,简单理解这个阶段会把一些静态方法替换为指向数据所存在的内存的指针。这也是所谓的静态链接的过程。
-
初始化:对类的静态变量初始化为指定的值,执行静态代码块。
-
使用
-
销毁
注意:主类在运行过程中如果使用到其它类,会逐步加载这些类。jar包或war包里的类不是一次性全部加载的,是使用到时才加载。
public class Launcher { private static URLStreamHandlerFactory factory = new Factory(); //整个jvm中只有一个Launcher 实例 private static Launcher launcher = new Launcher(); private static String bootClassPath = System.getProperty("sun.boot.class.path"); //jvm启动由c++调用getLauncher()方法会得到Launcher的一个实例 public static Launcher getLauncher() { return launcher; } private ClassLoader loader; //Launcher 的构造方法 本质其实就是给loader变量赋值 并且依次指定加载器的parent属性的值(该属性继承于ClassLoader类) public Launcher() { // Create the extension class loader ClassLoader extcl; try { //得到扩展类加载器 extcl = ExtClassLoader.getExtClassLoader(); } catch (IOException e) { throw new InternalError( "Could not create extension class loader", e); } // Now create the class loader to use to launch the application try { //得到应用程序类加载器 loader = AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( "Could not create application class loader", e); } .......此处省略 /* * Returns the class loader used to launch the main application. */ //Launcher对象会调用getClassLoader()拿到一个加载器 这个加载器就是应用程序类加载器 public ClassLoader getClassLoader() { return loader; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)