Java深入理解ClassLoader

的相关知识,又碰到了ClassLoader问题,所以拿来好好回顾一番。

基本功能

ClassLoader的主要作用是对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,,然后由ClassLoader返回这个类的class对象。

几个相关概念

ClassLoader负责载入系统所有Resources(Class,文件,来自网络的字节流等),通过ClassLoader从而将资源载入JVM,每一个class都有一个reference,指向自己的ClassLoader(Class.getClassLoader())。

工作过程(委托模型)

自从JDK1.2以后,ClassLoader做了改进,使用了委托模型,所有系统中的ClassLoader组成一棵树,ClassLoader在载入类库时先让Parent寻找,Parent找不到才自己找。JVM在运行时会产生三个ClassLoader,BootstrapClassLoader、ExtensionClassLoader和AppClassLoader。其中,BootstrapClassLoader是用C++编写的,在Java中看不到它,是null。它用来加载核心类库,就是在lib下的类库,ExtensionClassLoader加载lib/ext下的类库,AppClassLoader加载Classpath里的类库,三者的关为:AppClassLoader的Parent是ExtensionClassLoader,而ExtensionClassLoader的Parent为BootstrapClassLoader。加载一个类时,首先BootStrap进行寻找,找不到再由ExtensionClassLoader寻找,最后才是AppClassLoader。

ClassLoader源代码

protected synchronized Class loadClass(String name,boolean resolve) throws ClassNotFoundException{//首先检查该name指定的class是否有被加载Class c = findLoadedClass(name);if(c == null){try{if(parent != null){//如果parent不为null,则调用parent的loadClass进行加载c = parent.loadClass(name,false);}else{//parent为null,则调用BoostrapClassLoader进行加载c = findBootstrapClass0(name);}}catch(ClassNotFoundException e){//如果仍然无法加载成功,则调用自身的findClass进行加载c = findClass(name);}}if(resolve){resolveClass(c);}return c;}

在开始时却总是不厌其烦地渗透入生活的缝隙,

Java深入理解ClassLoader

相关文章:

你感兴趣的文章:

标签云: