类装载器,学习Servlet的类装载器,先要看一下Java的类装载器,Java虚拟机使用每个类的第一件事情就是将该类的字节码装载进来,装载字节码的功能是有类装载器完成的,类装载器负责根据一个类的名称来定位和生成类的字节码数据后返回个Java虚拟机。最常见的类加载器是将要加载的类名转换成一个.class文件名,然后从文件系统中找到该文件并读取其中的内容,再转换成Java虚拟机使用的类字节码返回给java虚拟机。类装载器也是一个java类,我们也可以开发自己的类装载器,以便通过其他方式来产生类字节码。当一个类被加载后,java虚拟机将其编译为可执行代码存储在内存中,并将索引信息存储进一个hashtable中,其索引关键字为与之相对应的类名。
java程序中的类本身也是一种事物,他也是用一个Java类描述,这个特殊的类名叫Class,类装载器装载某个类的字节码的过程实际上就是在创建Class类的一个实例对象,这个Class类的实例对象封装的内容正好是当前加载的类的字节码数据。
在程序中获得代表某个类的字节码数据的Class实例对象有三种方式:
类名.class ,对象.getClass() ,Class.forName("类名")
Java提供了一个类java.lang.ClassLoader来作为类装载器的基类,Java虚拟机和程序都调用ClassLoader类的loadClass方法来加载类,ClassLoader是一个抽象类,真正的类装载器必须是ClassLoader的子类。Class类中定义了一个getClassLoader方法,用于返回它所描述的类的类加载器对象,这个返回对象的类型就是ClassLoader。
类装载器的基本策略,
一个类装载器本身也是一个Java类,所以,类装载器自身也需要被另外的一类装载器装载。这有点不好理解了,java虚拟机中内嵌了一个称为Bootstrap的类装载器,它属于java虚拟机的内核,不用类装载器装载。Bootstrap类装载器负责加载java核心包中的类(rt.jar文件中的类),这些类的Class.getClassLoader方法返回值为null。ExtClassLoader类装载器负责加载存放在<java_home>/jre/lib/ext目录下的jar包中的类,AppClassLoader负责加载应用程序的启动执行类。
类装载器的委托模式
一个java虚拟机中所有类装载器采用具有父子关系的树形结果进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象,如果没有指定的话,则以ClassLoader.getSystemClassLoader()方法返回的系统类装载器作为其父级类装载器对象。
系统类装载器通常被设置为启动应用程序的AppClassLoader,可以通过java.system.class.loader系统属性来将系统类装载器设置为其他类装载器。ExtClassLoader是AppClassLoader的父级类装载器。getParent()方法可以得到类装载器的父级类装载器。每个ClassLoader本身只能加载特定位置的和目录中的类,但是,ClassLoader被设计成一种委托模式,使得某一个ClassLoader可以委托它的父级类装载器去加载类,从而让应用程序可以借助某一个子级的ClassLoader去多个位置和目录中进行类的加载。对于一个已被父级类装载器装载的类来说,java虚拟机默认也使用这个父级类装载器去装载他说调用的其他类。一个类装载器不能委托他的子孙类装载器去加载类,一个被父级类装载器装载的类无法调用那些只能被子级类装载器发现和装载的其他类。一个类装载器只能创建一个类的一份字节码数据。
采用委托模式避免了一个java虚拟机中多个类装载器为同一个类创建多份字节码数据的情况。只要开发人员自定义的类加载器不覆盖ClassLoader的loadClass方法(loadClass方法默认将加载委托给父级类装载器),而是覆盖findClass方法,这样就可以继续采用委托模式。
文章信息来源:http://aguang520.iteye.com/blog/794674
分享到:
相关推荐
1.装载阶段:在这个阶段,SERVLET 容器会装载 SERVLET 类,并创建一个 SERVLET 实例。 2.初始化阶段:在这个阶段,SERVLET 容器会调用 SERVLET 的 init() 方法,以完成 SERVLET 的初始化工作。 3.服务阶段:在这个...
了解Servlet的生命周期对于深入理解和掌握Servlet的工作机制至关重要。本文将从Servlet的基本概念入手,逐步深入到其生命周期的具体细节,并结合实际示例进行解析。 #### 二、Servlet基本概念 Servlet是一种Java类...
另外,当Servlet类文件被更新时,容器也会重新装载Servlet。在这一阶段,Servlet容器会创建Servlet的一个实例,并调用`init()`方法进行初始化。`init()`方法在整个Servlet生命周期中只被调用一次,通常用来进行一些...
6. 装载Servlet:根据`web.xml`中的配置,Tomcat实例化Servlet类,并调用其`init()`方法进行初始化。 7. 服务器开始监听并处理请求:一旦启动完成,Tomcat就开始接受HTTP请求,将请求分发给相应的Servlet进行处理。 ...
- **装载时机**:Servlet 类(.class 文件)必须放置在 Web 应用的 `WEB-INF\classes` 目录下或打包的 jar 文件放在 `WEB-INF\lib` 下才能被服务器加载。 - **创建时机**: - 默认情况下,当第一个客户端请求到达时...
当Web容器启动时,根据配置文件(如web.xml),它会装载Servlet类并创建一个Servlet实例。初始化阶段,Servlet会执行`init()`方法,通常用于设置初始参数。在服务过程中,每当有新的请求到来,Web容器并不会每次都...
Servlet与Servlet容器之间的关系可以类比为枪和子弹,Servlet是实现业务逻辑的“子弹”,而Servlet容器则是装载和发射这些“子弹”的“枪”。 Servlet容器的工作原理主要涉及以下几个关键点: 1. **Servlet容器...
Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。 Servlet的初始化 Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化...
2. **装载并创建 Servlet 实例**:调用 Servlet 的构造函数来创建其实例。 3. **调用 `init()` 方法**:初始化 Servlet 实例。 4. **创建请求和响应对象**:Servlet 引擎会创建 `ServletRequest` 和 `Servlet...
总结起来,这个实验旨在让学习者掌握Servlet容器模型的基本概念,通过实际操作了解web.xml的配置、ServletConfig和ServletContext的使用,以及RequestDispatcher的请求转发机制。通过这样的实践,可以加深对Servlet...
#### 八、Servlet装载时机 Servlet的装载时机有三种情况: 1. **启动时装载**:通过 `<load-on-startup>` 配置实现,优先级高的先加载。 2. **第一次请求时装载**:当第一次访问某个Servlet时才会加载。 3. **更新...
这是因为每次修改后都会重新加载Servlet或JSP,增加了类加载器的负担,降低了整体性能,并可能导致类之间的冲突。 因此,在部署到生产环境时,建议关闭自动装载功能,以确保更高效的运行时性能。 #### 技术3:控制...
装载是Web容器加载Servlet类,创建是为每个请求创建Servlet实例,销毁是在Web应用停止或卸载时释放资源。 10. JSP开发模式:主要有两种模式,JSP+JavaBean,以及更复杂的JSP+JavaBean+Servlet模式。前者将显示逻辑...
例如,Servlet和JSP的安全配置可以通过部署描述符(web.xml)设定,包括定义安全角色、URL模式的访问控制,以及实现HTTP基本认证、表单认证等不同的认证机制。同时,EJB的访问控制可以利用容器提供的服务,通过ejb-...
- **自定义装载器**:开发者可以创建自己的类装载器来控制类的装载过程,例如,Servlet 引擎通常会使用自定义的类装载器来动态装载更改过的类。 #### 三、Classpath 的挑战与应对策略 随着项目的复杂度增加,...