标签:系统 bootstra 之间 依次 请求 四种 结果 虚拟机 blog
java类加载器是通过一个类的全限定名来获取描述此类的二进制字节流,来进行加载;
加载器是在虚拟机外部实现的,方便让程序自己决定获取所需要的类。
对于开发人员来说,java的类加载器有四种,全都继承自抽象类java.lang.ClassLoader:
它是虚拟机的一部分,无法被Java程序直接引用,所以System.class.getClassLoader()结果为null;
负责加载JAVA_HOME\lib目录中规定的类库,例如rt.jar的java.lang.object等核心api。
负责加载<JAVA_HOME>\lib\ext目录,可以被开发人员直接使用。
程序默认的加载器,负责加载ClassPath下的类或jar,可以被开发人员直接使用。
启动类加载器 > 扩展类加载器 > 程序类加载器 >自定义类加载器:
它们之间不是继承关系,而是通过组合实现的,而这种模型也被称为双亲委派,如下图:
双亲委派的代码逻辑在java.lang.ClassLoader.loadClass()中;
他是说某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归;
如果父类加载器可以完成类加载任务,就成功返回;
只有父类加载器无法完成此加载任务时,才自己去加载。
因为java的设计体系,比如继承,所有的类都必须继承object类,那就必须确定object是唯一的,否则我们怎么知道该继承哪个object;
而双亲委派会把加载类递归交给上一层加载器去做,如果加载不了,就自己完成,这一确保了类在系统中的唯一性。
标签:系统 bootstra 之间 依次 请求 四种 结果 虚拟机 blog
原文地址:http://www.cnblogs.com/dahuandan/p/7112245.html