在Java中用类装载框架控制类加载

摘要 通过构建一个能够把Java类装载隔离到一个指定的jar文件中的类装载组件容器框架,你可以确保运行时刻会装载你期望的组件版本。

Java的类装载框架强有力且具有灵活性。它允许应用程序存取类库而不必链接到静态的"include"文件。代之的是,它能够从指定位置装载包含库类和资源的档案文件,例如由CLASSPATH环境变量所定义的目录和网络位置。由系统来动态地解析对类和资源的运行时刻参考,从而简化了更新和版本发行。然而,每一个库都有其自己的依赖性集合-并且由开发者和发布人员来保证他们的应用程序适当地参考正确的版本。遗憾的是,默认的类装载系统和特定依赖性的结合可能并且确实会导致错误、系统崩溃甚至于更糟糕的情况发生。

本文中,我将向你建议一个实现类装载的容器框架,从而解决这些问题。

一、Java Classpath

Java根据环境属性/变量CLASSPATH来指定运行时刻用来查找类和其它资源的路径。你可以通过设置CLASSPATH环境变量或使用Java命令行选项--classpath来定义CLASSPATH属性。

典型地,一个Java运行时刻以下面顺序查找和加载类:

1. 在bootstrap类列表中的类-这些是体现Java平台的类,例如在rt.jar中的类。

2. 出现在扩展类列表中的类-这些类使用扩展机制框架来扩展Java平台,使用位于运行时刻环境的/lib/ext目录下的档案文件(.jar,.zip,等等。)。

3. 用户类-这些类不使用-classpath命令行选项或CLASSPATH环境变量标识的扩展机制架构。

二、档案与Classpath

一个档案.jar或.zip文件可以包括一个manifest文件-它们包含能够用于提供档案信息,设置档案属性,等等的入口。这个manifest文件还可以通过包括一个名为Class-Path的入口(它包含一个档案和目录列表)来扩展classpath。JDK 1.3中引入了Class-Path manifest入口用于指定可选的据需要可以加载的jar文件和目录。下面是一个Class-Path入口的例子:

Class-Path: mystuff/utils.jar

mystuff/logging.jar mylib/

Java提供了一种可扩展模型用于指定装载类的位置和文件列表。然而,由此也引发了一些问题,例如,一个不同版本的库可能存在于classpath中-这超出一个执行类所期望的结果。

三、Classpath版本冲突

在Java中,一个类的运行时刻标识是由通过其完全限定名字来定义的(在类名之前的包名,有时被作为FQN),所有这些都添加到装载类的相关装载器的ID。这样以来,由多个类加载器加载的一个类的每一个实例都将被当作是Java运行时刻的一个单独的实体。这意味着,运行时刻能够在任何时间装载同一个类的多个版本。这是一种非常有力和相当灵活的特征;然而,如果一位开发人员不认真地使用的话,某些副作用可能会令他疑惑不解。

可以设想,你在开发一个企业应用程序-它使用类似语义从多种源存取数据,例如一个文件系统和一个数据库。许多这种类型的系统都暴露一个数据存取层-通过抽象类似数据源的数据存取对象(DAO)。现在,设想你装载一个新版本的一个数据库DAO,使用一种略微不同的API来满足一个DAO客户端的新特征的要求-但是你仍然需要旧式的DAO以便适合于其它还没有为这种新的API准备好的客户端。在典型的运行时刻环境下,这种新的DAO将简单地替换旧的版本并且所有的新实例都将从新版本中创建。然而,如果在不停止运行时刻环境的前提下发生更新,那么任何已经存在的旧DAO的实例将与该新DAO的任何实例一起驻留于内存中-当创建这些新实例时。这已经足已令人疑惑了。更为糟糕的是,一位DAO客户期望创建一个旧版本的DAO的实例,但是实际上得到一个具有已改变的API的新版本的实例。正如你所见,这可能会带来一些有趣的挑战。

为了确保稳定性和安全性,调用代码必须能够指明它想使用的类的正确版本。为此,你可以创建一个类加载器,组件容器模型并且使用一些简单的类加载技术。

时间: 2024-12-23 10:48:28

在Java中用类装载框架控制类加载的相关文章

Java虚拟机类装载的原理及实现

一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行.本文将分析JVM中的类装载系统,探讨JVM中类装载的原理.实现以及应用. 二.Java虚拟机的类装载实现与应用 2.1 装载过程简介 所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程,其中类或接口的名称是

反射 注解-Java利用反射执行框架注入类的非静态方法

问题描述 Java利用反射执行框架注入类的非静态方法 之前对代码做优化,利用了反射去执行指定类的指定方法: public static JsonResultVO callMethod(Class<?> className String methodName Class<?>[] paramClass Object[] param) { JsonResultVO resultVO = new JsonResultVO(); try { Method m = className.get

漫谈Java实例化类

  Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢?     经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉.     怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢?     本文试图从几段鲜活的代码入手,给大家呈现不一样的 Java 实例化类.     下面代码取自 com.google.zxing 源码实现: public BitMatrix encode(String contents, BarcodeFormat format

JAVA:类再生

复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 两种代码重用机制:组合和继承 1.组合语法 组合:将对象引用置于新类中 类中域为基本变量时能够自动被初始化为零.但是对象引用会被初始化为null 初始化引用,可以在代码中下列位置进行: 1.在定义对象的地方.这意味着它们总是能够在构造器之前被初始化 2.在类的构造器中 3.就在正要使用这些对象之前,这种方式称为惰性初始化 4.使用实例初始化. 2.继承语法 继

websocket即时通讯java SpringMVC mybatis 后台框架 集成代码生成器开发利器

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势D 集成安全权限框架shiro  Shiro 是一个用 Java 语言

java class类入门笔记

概念 类可以看成是创建Java对象的模板. 类是客观存在的,抽象的,概念的东西. 类必须使用class关键字来表明这是一个类. 既然是类,java允许类不加public关键字约束,当然类的定义只能限制为public或者无限制关键字(默认的). 例如一个人类: public class Person{   } 或者 class Person{   } 上述实例中,public关键字是这个类的访问权限,class关键字表明这是一个类,Person是类的名称. main方法 main()方法的声明为:

Java实例化类详解_java

Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢?     经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉.     怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢?     本文试图从几段鲜活的代码入手,给大家呈现不一样的 Java 实例化类.     下面代码取自 com.google.zxing 源码实现: public BitMatrix encode(String contents, BarcodeFormat format,

Java共享类

要真正彼此隔离 Java 应用程序,实质上需要多个 JVM,然而启动成本和内存占用使这种方式不那么理想.而共享类可以同时解决这两个问题.在多 JVM 环境中,共享类通过将一组核心系统类装载到共享内存中,可以在多个 JVM 中共享这些类.这些共享类放到内存的一个共享区域中,它们在这里对所有 JVM 都是保持一致的.结果,共享类只需要在第一次使用时装载到内存中,这消除了在以后每次 JVM 调用时装载它们的固定成本,并减少了每个 JVM 中的内存占用. IBM 在 z/OS 平台上实现了共享类技术.A

Java企业应用系统框架的比较与选择

摘 要 目前流行的Java企业应用系统框架种类繁多,为了使开发人员正确选择系统架构从而提高Java企业应用的开发效率,首先针对基于EJB和基于POJOs的较为流行的几种框架分别进行了概述,然后对这些框架从表现层.业务逻辑层和持久层的实现细节进行了对比,总结了Java企业应用系统框架选择需要侧重考虑因素,得到了基于EJB的框架和基于POJOs的框架分别适用的范围. 关键词 Java企业应用系统框架:EJB3.0:Spring:Hibernate 引言 EJB的体系结构是J2EE的基础和核心,J2E