快速业务通道

深入探讨Java类加载器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
er))  != -1) {         baos.write(buffer, 0,  bytesNumRead);       }       return  baos.toByteArray();     } catch (IOException e) {        e.printStackTrace();     }     return  null;   }   private String classNameToPath (String className) {     return rootDir +  File.separatorChar          + className.replace(''.'',  File.separatorChar) + ".class";   } }

如 代 码清单 6 所示,类 FileSystemClassLoader 继承自类 java.lang.ClassLoader 。在 表 1 中列出的 java.lang.ClassLoader 类的常用方法中,一般来说,自 己开发的类加载器只需要覆写 findClass(String name) 方法即可。 java.lang.ClassLoader 类的方法 loadClass() 封装了前面提到的代理模式的 实现。该方法会首先调用 findLoadedClass() 方法来检查该类是否已经被加载 过;如果没有加载过的话,会调用父类加载器的 loadClass() 方法来尝试加载 该类;如果父类加载器无法加载该类的话,就调用 findClass() 方法来查找该 类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时, 最好不要覆写 loadClass() 方法,而是覆写 findClass() 方法。

类 FileSystemClassLoader 的 findClass() 方法首先根据类的全名在硬盘上查找 类的字节代码文件(.class 文件),然后读取该文件内容,最后通过 defineClass() 方法来把这些字节代码转换成 java.lang.Class 类的实例。

深入探讨Java类加载器(7)

时间:2011-06-12 IBM 成富

网络类加载器

下面将通过一个网络类加载器来说明如何通过类加 载器来实现组件的动态更新。即基本的场景是:Java 字节代码(.class)文件 存放在服务器上,客户端通过网络的方式获取字节代码并执行。当有版本更新的 时候,只需要替换掉服务器上保存的文件即可。通过类加载器可以比较简单的实 现这种需求。

类 NetworkClassLoader 负责通过网络下载 Java 类字节代码并定义出 Java 类。它的实现与 FileSystemClassLoader 类似。在通过 NetworkClassLoader 加载了某个版本的类之后,一般有两种做法来使用它。第一种做法是使用 Java 反射 API。另外一种做法是使用接口。需要注意的是,并不能直接在客户端代码 中引用从服务器上下载的类,因为客户端代码的类加载器找不到这些类。使用 Java 反射 API 可以直接调用 Java 类的方法。而使用接口的做法则是把接口的 类放在客户端中,从服务器上加载实现此接口的不同版本的类。在客户端通过相 同的接口来使用这些实现类。

在介绍完如何开发自己的类加载器之后, 下面说明类加载器和 Web 容器的关系。

类加载器与 Web 容器

对 于运行在 Java EE™ 容器中的 Web 应用来说,类加载器的实现方式与一 般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载 器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理 给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中 的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类 。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也 是为了保证 Java 核心库的类型安全。

绝大多数情况下,Web 应用的开 发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则:

每个 Web 应用自己的 Java 类文件和使用的库的 jar 包,分别放在 WEB- INF/classes 和 WEB-INF/lib 目录下面。

多个应用共享的 Java 类文件 和 jar 包,分别放在 Web 容

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多
你可能对下面的文章感兴趣
    HTTP/1.1 401 Access Denied

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号