转载自: https://blog.csdn.net/eric_sunah/article/details/17289985
1.1 什么是ClassLoader
顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一 个Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。
基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。下面详细介绍这个 Java 类。
1.2 ClassLoader 的职责
java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。不过本文只讨论其加载类的功能。
1.3 什么是ClassLoader Delegation
细节请参见:http://blog.csdn.net/eric_sunah/article/details/7969077
关于类加载器的层次结构,以下的几点说明可能更有助于进一步的理解类的查找和加载过程:
- 每个类加载器负责在自身定义的类路径上进行查找和加载类。
- 一个子类加载器能够委托它的父类加载器查找和加载类,一个加载类的请求会从子类加载器发送到父类加载器,但是从来不会从父类加载器发送到子类加载器。
- 一旦一个类被成功加载, JVM 会缓存这个类直至其生命周期结束,并把它和相应的类加载器关联在一起,这意味着不同的类加载器可以加载相同名字的类。
- 如果一个加载的类依赖于另一个或一些类,那么这些被依赖的类必须存在于这个类的类加载器查找路径上,或者父类加载器查找路径上。
如果一个类加载器以及它所有的父类加载器都无法找到所需的类,系统就会抛出 ClassNotFoundExecption 异常或者 NoClassDefFoundError 的错误
1.4 WAS的Class Loader
WebSphere 中类加载器的层次结构图1 所示:
如上图所示,WebSphere 中类加载器被组织成一个自上而下的层次结构,最上层是系统的运行环境JVM ,最下层是具体的应用程序,上下层之间形成父子关系。
- JVM Class loader :位于整个层次结构的最上层,它是整个类加载器层次结构的根,因此它没有父类加载器。这个类加载器负责加载 JVM 类, JVM 扩展类,以及定义在 classpath 环境变量上的所有的 Java 类。
- WebSphere Extensions Class loader : WebSphere 扩展类加载器 , 它将加载 WebSphere 的一些 runtime 类,资源适配器类等。
- WebSphere lib/app Class loader : WebSphere 服务器类加载器,它将加载 WebSphere 安装目录下 $(WAS_HOME)/lib/app 路径上的类。 在 WAS v4 版本中, WAS 使用这个路径在所有的应用程序之间共享 jar 包。从 WAS v5 开始, 共享库功能提供了一种更好的方式,因此,这个类加载器主要用于一些原有的系统的兼容。
- WebSphere "server" Class loader : WebSphere 应用服务器类加载器。 它定义在这个服务器上的所有的应用程序之间共享的类。 WAS v5 中有了共享库的概念之后,可以为应用服务器定义多个与共享库相关联的类加载器,他们按照定义的先后顺序形成父子关系。
- Application Module Class Loader :应用程序类加载器,位于层次结构的最后一层,用于加载 J2EE 应用程序。根据应用程序的类加载策略的不同,还可以为 Web 模块定义自己的类加载器。
1.5 WebSphere 中的类加载器策略
WebSphere 中对类加载器有一些相关的配置,称为类加载器策略(class loader policy )。类加载器策略指类加载器的独立策略(classloader isolation policy ), 通过类加载器策略设置,我们可以为WAS 和应用程序的类加载器进行独立定义。
每个WAS 可以配置自己的应用程序类加载器策略,WAS 中的每个应用程序也可以配置自己的Web 模块类加载器策略,下面我们对这两种策略分别介绍。
1.5.1 应用服务器(WAS )配置:应用程序类加载器策略
应用服务器对应用程序类加载器策略有两种配置:
- Single :整个应用服务器上的所有应用程序(Jar,RAR,EJBJAR)使用同一个类加载器(Application classloader)。在这种配置下,每个应用程序不再有自己的类加载器,每个Application中jar文件可以互相访问。
部署模型如下:
- Multiple(DEFAULT) :应用服务器上的每个应用程序使用自己的类加载器。
部署模型如下:
- WAR如何被加载,由WAR单独的侧率来决定
1.5.2 应用程序配置:Web 模块类加载器策略
应用程序中对Web模块类加载器有两种配置:
- Application :整个应用程序内的所有的实用程序 jar 包和 Web 模块使用同一个类加载器。
- Module(DEFAULT) :应用程序内的每个 Web 模块使用自己的类加载器。应用程序的类加载器仍然存在,负责加载应用程序中 Web 模块以外的其它类,包括所有的实用程序 jar 包。
1.5.3 ClassLoader模式的设置
该设置针对Application/WAR加载器都有效
- Parent_First :在加载类的时候,在从类加载器自身的类路径上查找加载类之前,首先尝试在父类加载器的类路径上查找和加载类。
- Parent_Last :在加载类的时候,首先尝试从自己的类路径上查找加载类,在找不到的情况下,再尝试父类加载器类路径。
1.6 综合配置的小例子
相关推荐
- **应用服务器类装入器策略**:允许管理员选择不同的类装入器策略,如“父优先”或“子优先”,以控制类的加载顺序。 - **类加载/委托模式**:定义类装入器如何与其他类装入器协作,以确定哪个类装入器应该加载特定...
1. **简单的Web模块**:介绍了最基本的Web模块类装载器配置。 2. **添加EJB模块和工具JAR**:展示了如何在现有配置的基础上增加新的模块和外部JAR文件,并说明了如何正确地配置这些资源的装载顺序。 3. **改变WAR...
- **类加载器配置**:开发者应该根据应用的需求选择合适的类加载器策略,例如使用父类加载器优先或子类加载器优先。 - **类路径设置**:确保所有的类库都已添加到类路径中,同时注意避免重复的类库导致的冲突。 ###...
- **资源加载优化**:确保Shiro的资源(如权限定义)加载及时且高效,避免在运行时频繁加载。 6. **兼容性测试**:在进行jar包替换后,应进行充分的兼容性和性能测试,确保新版本的Shiro不仅解决了性能问题,而且...
2. **Java安全**:J2EE环境下的安全措施,涵盖类加载器、代码签名等。 3. **WebSphere安全**:WAS特有的安全功能,比如用户注册、授权管理等。 ### 安全集成场景 文档中详细讨论了多种安全集成场景,例如SPNEGO...
了解如何使用VI编辑器、shell脚本编写以及权限管理至关重要。此外,掌握系统监控工具(如topas、iostat、vmstat)和故障排查手段也是必要的。 三、系统集成 在系统集成中,AIX常作为关键组件与其他系统(如Linux、...
3. **静态初始化块**: 在类加载时自动执行,主要用于初始化静态成员。 #### 七、Final关键字 1. **常量**: 被final修饰的变量是常量,一旦赋值就不能更改。 2. **不可重写的方法**: final修饰的方法不能被子类覆盖...
在JSR 168中,开发者可以使用`Portlet`接口和相关的类来创建portlet,而IBM Portlet API可能会提供额外的类和接口。例如,一个简单的JSR 168 portlet可能会重写`doView`方法来生成视图,而在IBM Portlet API中,可能...
13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器...
13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器...
8. **脚本和样式加载策略:** - 探讨了如何高效地加载 JavaScript 脚本和 CSS 样式文件。 9. **请求错误与会话过期处理:** - 提供了处理请求错误和会话过期的策略。 10. **皮肤化(Skinnability):** - 介绍为...
MyBatis通过使用简单的XML或注解进行配置和原始映射,将对象与数据库中的记录进行映射,消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java...
本指南将详细介绍RichFaces的核心概念、技术需求以及如何在不同环境中配置并使用它。 #### 二、技术要求 1. **支持的Java版本**:RichFaces 支持多种Java版本,确保了广泛的兼容性和稳定性。 2. **支持的Java ...
1. **Java Servlet规范**:Tomcat 6.0.20支持Servlet 2.5规范,这是Servlet技术的第四个主要版本,提供了许多增强功能,包括过滤器链的改进、事件监听器的扩展以及对MIME类型处理的增强。 2. **JavaServer Pages ...
6. **脚本和样式加载策略**:配置脚本和样式文件的加载方式,以提高性能。 7. **请求错误和会话过期处理** - **请求错误处理**:处理 Ajax 请求失败的情况。 - **会话过期处理**:处理会话过期后的重定向或提示。...
#### 过滤器配置与资源加载策略 - **Filter配置**:通过自定义过滤器优化资源加载过程,提高加载速度。 - **脚本和样式加载策略**:合理安排CSS和JavaScript文件加载顺序,减少加载时间。 #### 错误与会话管理 - ...
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装...