西安市免费做网站,wordpress小说采集,免费网上咨询医生是哪个网,怎么做网站充值网站一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的…一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的加载动作但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。比较两个类是否“相等”只有在这两个类是由同一个类加载器加载的前提之下才有意义否则即使这两个类是来源于同一个Class文件只要加载它们的类加载器不同那这两个类就必定不相等。 二、双亲委派模型 站在Java虚拟机的角度讲只存在两种不同的类加载器一种是启动类加载器Bootstrap ClassLoader这个类加载器使用C语言实现是虚拟机自身的一部分另外一种就是所有其他类的加载器这些类加载器都由Java语言实现独立于虚拟机外部并且全部都继承自抽象类java.lang.ClassLoader。 类加载器 (1) 启动类加载器Bootstrap ClassLoader 将存放于JAVA_HOME\lib目录中的或者被-Xbootclasspath参数所指定的路径中的并且是虚拟机识别的仅按照文件名识别如 rt.jar 名字不符合的类库即使放在lib目录中也不会被加载类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。 (2) 扩展类加载器Extension ClassLoader 将JAVA_HOME\lib\ext目录下的或者被java.ext.dirs系统变量所指定的路径中的所有类库加载开发者可以直接使用扩展类加载器。 (3)应用程序类加载器 Application ClassLoader 负责加载用户类路径(ClassPath)上所指定的类库开发者可直接使用。 类加载器双亲委派模型如下图所示 工作过程 如果一个类加载器接收到了类加载的请求它首先把这个请求委托给他的父类加载器去完成每个层次的类加载器都是如此因此所有的加载请求都应该传送到顶层的启动类加载器中只有当父加载器反馈自己无法完成这个加载请求它在搜索范围中没有找到所需的类时子加载器才会尝试自己去加载。 好处 Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object它存放在rt.jar中无论哪个类加载器要加载这个类最终都会委派给启动类加载器进行加载因此Object类在程序的各种类加载器环境中都是同一个类。相反如果用户自己写了一个名为java.lang.Object的类并放在程序的Classpath中那系统中将会出现多个不同的Object类java类型体系中最基础的行为也无法保证应用程序也会变得一片混乱。 三、双亲委派模型的实现 实现双亲委派模型的代码都集中在java.lang.ClassLoader的loadClass方法中如下所示 protected Class? loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass? c findLoadedClass(name);if (c null) {long t0 System.nanoTime();try {if (parent ! null) {c parent.loadClass(name, false);} else {c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c null) {// If still not found, then invoke findClass in order// to find the class.long t1 System.nanoTime();c findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}} 参考资料 http://www.cnblogs.com/lanxuezaipiao/p/4138511.html