我爱编程

ClassLoader

2018-04-14  本文已影响22人  我是王串串的崔先生

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()寻找该类

上一篇下一篇

猜你喜欢

热点阅读