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;
    }
posted @ 2024-01-09 21:03  程序马2023  阅读(28)  评论(0)    收藏  举报