的相关知识,又碰到了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;}
在开始时却总是不厌其烦地渗透入生活的缝隙,