您的位置:首页 > 其它

类加载的过程

2016-04-15 13:24 441 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: