ClassLoader 顾名思义 是jvm用来加载类的 。
先看一下
package java.lang;
public abstract class ClassLoader {
public Class loadClass(String name);
protected Class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent();
}
loadClass() 用来加载类 返回一个class对象
defineClass() 接受一个byte[] 返回一个Class对象
getResourse() 则从加载路径上放回加载的文件url
getParent() 返回父加载器
bootStrapClassLoader 是jvm的一部分,运用c编写,用来加载jvm核心类库。
//如果调用classname.getClassLoader() 返回null //则是有bootStrapClassLoader加载。
%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class 包括String和number类
ExtentionClassLoader 是拓展的类加载器 主要加载%java_home%lib\ext 下的类库
AppClassLoader 也叫SystenAppClass 加载当前classpath的所有类
加载顺序是
BootStrapClassLoader > ExtentionClassLoader > AppClassLoader
每个类加载器都有一个父加载器 可以通过调用getParent()方法获得
类加载器 使用双亲委托
loadClass(name)
当前加载器在缓存中查找是否加载过该类 如果没加载则向父加载器询问是否加载过该类 如果都没有则放回本加载器加载
findLoadedClass() if fail 调用getParent() .loadClass() 如果父类加载失败 则调用findClass()寻找该类
网友评论