快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ory 的实例。这里的实例的真正的类是继承 自 javax.xml.parsers.DocumentBuilderFactory,由 SPI 的实现所提供的。如 在 Apache Xerces 中,实现的类是 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl。而问题在于,SPI 的 接口是 Java 核心库的一部分,是由引导类加载器来加载的;SPI 实现的 Java 类一般是由系统类加载器来加载的。引导类加载器是无法找到 SPI 的实现类的 ,因为它只加载 Java 的核心库。它也不能代理给系统类加载器,因为它是系统 类加载器的祖先类加载器。也就是说,类加载器的代理模式无法解决这个问题。

线程上下文类加载器正好解决了这个问题。如果不做任何的设置,Java 应用 的线程的上下文类加载器默认就是系统上下文类加载器。在 SPI 接口的代码中 使用线程上下文类加载器,就可以成功的加载到 SPI 实现的类。线程上下文类 加载器在很多 SPI 的实现中都会用到。

下面介绍另外一种加载类的方法 :Class.forName。

Class.forName

Class.forName 是一个静态方 法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader) 和 Class.forName(String className)。第一种形式的参数 name 表示的是类的全名;initialize 表示是 否初始化类;loader 表示加载时使用的类加载器。第二种形式则相当于设置了 参数 initialize 的值为 true,loader 的值为当前类的类加载器。 Class.forName 的一个很常见的用法是在加载数据库驱动的时候。如 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance() 用 来加载 Apache Derby 数据库的驱动。

在介绍完类加载器相关的基本概 念之后,下面介绍如何开发自己的类加载器。

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

时间:2011-06-12 IBM 成富

开发自己的类加载器

虽然在绝大多数情况下,系统默认提供的类加载器实现已经可以满足需 求。但是在某些情况下,您还是需要为应用开发出自己的类加载器。比如您的应 用通过网络来传输 Java 类的字节代码,为了保证安全性,这些字节代码经过了 加密处理。这个时候您就需要自己的类加载器来从某个网络地址上读取加密后的 字节代码,接着进行解密和验证,最后定义出要在 Java 虚拟机中运行的类来。 下面将通过两个具体的实例来说明类加载器的开发。

文件系统类加载器

第一个类加载器用来加载存储在文件系统上的 Java 字节代码。完整的 实现如 代码清单 6 所示。

清单 6. 文件系统类加载器

public class FileSystemClassLoader extends  ClassLoader {   private String rootDir;    public FileSystemClassLoader(String rootDir) {      this.rootDir = rootDir;   }   protected  Class<?> findClass(String name) throws  ClassNotFoundException {     byte[] classData =  getClassData(name);     if (classData == null) {        throw new ClassNotFoundException();     }      else {       return defineClass(name, classData,  0, classData.length);     }   }    private byte[] getClassData(String className) {      String path = classNameToPath(className);     try {       InputStream ins = new FileInputStream(path);        ByteArrayOutputStream baos = new ByteArrayOutputStream ();       int bufferSize = 4096;       byte[]  buffer = new byte[bufferSize];       int bytesNumRead  = 0;       while ((bytesNumRead = ins.read(buff

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

分享到: 更多

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号