Java编程的动态性,第1部分: 类和类装入 - 编程入门网
自己的 Class 实例。即使这 些副本都共享同一个类名,但对 JVM 而言它们都是独立的类。
非常规(类)路径 装入到 JVM 的类是由 类装入器控制的。JVM 中构建了一个 引导程序类装入器,它负责 装入基本的 Java 类库类。这个特殊的类装入器有一些专门的特性。首先,它只装入在引导 类路径上找到的类。因为这些是可信的系统类,所以引导程序装入器跳过了对常规(不可信 )类所做的大量验证。 引导程序不是唯一的类装入器。对于初学者而言,JVM 为装入标准 Java 扩展 API 中的 类定义了一个 扩展类装入器,并为装入一般类路径上的类(包括应用程序类)定义了一个 系统类装入器。应用程序还可以定义它们自己的用于特殊用途(例如运行时类的重新装入) 的类装入器。这样添加的类装入器派生自 java.lang.ClassLoader 类(可能是间接派生的) ,该类对从字节数组构建内部类表示( java.lang.Class 实例)提供了核心支持。每个构造 好的类在某种意义上是由装入它的类装入器所“拥有”。类装入器通常保留它们所装入类的 映射,从而当再次请求某个类时,能通过名称找到该类。 每个类装入器还保留对父类装入器的引用,这样就定义了类装入器树,树根为引导程序装 入器。在需要某个特定类的实例(由名称来标识)时,无论哪个类装入器最初处理该请求, 在尝试直接装入该类之前,一般都会先检查其父类装入器。如果存在多层类装入器,那么会 递归执行这一步,所以这意味着通常不仅在装入该类的类装入器中该类是 可见的,而且对于 所有后代类装入器也都是可见的。这还意味着如果一条链上有多个类装入器可以装入某个类 ,那么该树最上端的那个类装入器会是实际装入该类的类装入器。 在许多环境中,Java 程序会使用多个应用程序类装入器。J2EE 框架就是一个示例。该框 架装入的每个 J2EE 应用程序都需要拥有一个独立的类装入器以防止一个应用程序中的类干 扰其它应用程序。该框架代码本身也将使用一个或多个其它类装入器,同样用来防止对应用 程序产生的或来自应用程序的干扰。整个类装入器集合形成了树状结构的层次结构,在其每 个层次上都可装入不同类型的类。 Java编程的动态性,第1部分: 类和类装入(4)时间:2011-04-09 IBM Dennis M. Sosnoski装入器树 作为类装入器层次结构的实际示例,图 1 显示了 Tomcat servlet 引擎定义的类装入器 层次结构。这里 Common 类装入器从 Tomcat 安装的某个特定目录的 JAR 文件进行装入,旨 在用于在服务器和所有 Web 应用程序之间共享代码。Catalina 装入器用于装入 Tomcat 自 己的类,而 Shared 装入器用于装入 Web 应用程序之间共享的类。最后,每个 Web 应用程 序有自己的装入器用于其私有类。 图 1. Tomcat 类装入器 在这种环境中,跟踪合适的装入器以用于请求新类会很混乱。为此,在 Java 2 平台中将 setContextClassLoader 方法和 getContextClassLoader 方法添加到了 java.lang.Thread 类中。这些方法允许该框架设置类装入器,使得在运行每个应用程序中的代码时可以将类装 入器用于该应用程序。 能装入独立的类集合这一灵活性是 Java 平台的一个重要特性。尽管这个特性很有用,但 是它在某些情况中会产生混淆。一个令人混淆的方面是处理 JVM 类路径这样的老问题。例如 ,在图 1 显示的 Tomcat 类装入器层次结构中,由 Common 类装入器装入的类决不能(根据 名称)直接访问由 Web 应用程序装入的类。使这些类联系在一起的唯一方法是通过使用这两 个类集都可见的接口。在这个例子中,就是包含由 Java servlet 实现的 javax.servlet.Servlet 。 无论何种原因在类装入器之间移动代码时都会出现问题。例如,当 J2SE 1.4 将用于 XML 处理的 JAXP API 移到标准分发版中时,在许多环 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |