类加载的过程

来源:互联网 发布:坐炮机的体验知乎 编辑:程序博客网 时间:2024/06/03 18:16

Java虚拟机定义了三种类加载器:

  启动类加载器(Bootstrap):引导类装入器是用本地代码实现的类装入器,它负责<JAVA_Runtime_Home>/lib下面类库加载到内存中。由于引导类加载器设计到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

  准扩展(Extension)类加载器:扩展类加载是由Sun的ExtClassLoader实现的。它负责将<Java_Runtime_Home>/lib/ext或者由系统变量java.ext.dir指定位置中的类库加载到内存中。开发者可以使用标准扩展类加载器。

系统(System)类加载器:系统类加载器是由 Sun  AppClassLoader

sun.misc.Launcher$AppClassLoader实现的。它负责将系统类路径(CLASSPATH

中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

<span style="font-size:18px;">public Class<?> loadClass(String name)throws ClassNotFoundException {        return loadClass(name, false);}protectedsynchronized Class<?> loadClass(String name, boolean resolve)            throws ClassNotFoundException {        // 首先判断该类型是否已经被加载        Class c = findLoadedClass(name);        if (c == null) {            //如果没有被加载,就委托给父类加载或者委派给启动类加载器加载            try {                if (parent != null) {//如果存在父类加载器,就委派给父类加载器加载                    c = parent.loadClass(name, false);                } else {//如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)                    c = findBootstrapClass0(name);                }            } catch (ClassNotFoundException e) {        // 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能                c = findClass(name);            }        }        if (resolve) {            resolveClass(c);        }        return c;    }</span>


0 0
原创粉丝点击