美文网首页源码系列
类加载ClassLoader.loadClass()与Class

类加载ClassLoader.loadClass()与Class

作者: Bearoooo | 来源:发表于2020-01-29 16:22 被阅读0次

1. 类加载说明

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

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

  • 加载:查找和导入类或接口的二进制数据;
  • 链接:又可以分成校验、准备和解析三步,其中解析步骤是可以选择的;
    • 校验:检查导入类或接口的二进制数据的正确性;
    • 准备:给类的静态变量分配并初始化存储空间;
    • 解析:将符号引用转成直接引用;
  • 初始化:激活类的静态变量的初始化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);
  • 从以上ClassLoader.loadClass()的源码来看, 由于并不会执行resolveClass(Class<?> c)链接, 因此也不会执行加载的第三步骤初始化.
  • Class.forName()是会执行初始化.
//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;

相关文章

  • 关于Java反射

    关于Class 类加载的几种方式 new Xxx() classLoader.loadClass(String c...

  • 面试官:类的加载方式

    类的加载方式 1、隐式加载 -new2、显式加载 -ClassLoader.loadClass和Class.fo...

  • 类加载ClassLoader.loadClass()与Class

    1. 类加载说明 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其...

  • jvm相关面试题

    类加载的过程 classLoader.loadClass的类加载过程有如下几步:加载 >> 验证 >> 准备 >>...

  • 类加载时机和生命周期_看图说话

    类加载时机 类生命周期 类加载机制 双亲委派机制的核心,ClassLoader.loadClass(): 这种委派...

  • 每日一题2019-11-29

    Class.forName与ClassLoader.loadClass有什么区别?类的生命周期是怎样的? 参考答案...

  • java 汇总

    反射中,Class.forName和Classloader.loadclass的区别加载,链接,初始化forNam...

  • JVM类加载器子系统ClassLoader

    1 类加载器与类的加载过程 类加载器子系统的作用:类加载子系统负责从文件或者网络中加载class文件,class文...

  • JVM类加载入门

    一 类加载顺序 class类加载-->验证-->准备--->解析--->初始化 class类加载:通过类加载器加载...

  • 热修复类加载项目实战

    android 与 java 的类加载器 类别加载文件类加载器分类java.class 文件{{java类加载机制...

网友评论

    本文标题:类加载ClassLoader.loadClass()与Class

    本文链接:https://www.haomeiwen.com/subject/ebuethtx.html