源码系列

类加载ClassLoader.loadClass()与Class

2020-01-29  本文已影响0人  Bearoooo

1. 类加载说明

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成校验、准备和解析三步

除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:


2. 源码

// ClassLoader.Java
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }

    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException {

        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            //...
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

    /**
     * Links the specified class.  执行链接
     */
    protected final void resolveClass(Class<?> c) {
        resolveClass0(c);
    }
    // native方法
    private native void resolveClass0(Class<?> c);
//CLass.java
    @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }

    /** Called after security check for system loader access checks have been made. */
    private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)
        throws ClassNotFoundException;
上一篇 下一篇

猜你喜欢

热点阅读