`
wjheye
  • 浏览: 82246 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

Servlet类的装载机制

阅读更多
类装载器,学习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
分享到:
评论

相关推荐

    java-servlet-api.doc

    Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。 Servlet的初始化 Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    Spring、SpringMVC和Mybatis框架整合包

    但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括service dao里面的),有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring...

    Spring.3.x企业应用开发实战(完整版).part2

    3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...

    Hibernate中文详细学习文档

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual...

    Hibernate+中文文档

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual...

    Hibernate参考文档

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual...

    JSP安全性初探

    综述:有几种办法可以暴露JSP代码,不过经过大量测试,这和WEB SERVER的配置有绝对的关系,就拿IBM ...我们要干的事情是,让JSP在编译前被浏览器当作一个文本或其它文件发送给客户端,或在JSP装载的时候不去执行

    DWR.xml配置文件说明书(含源码)

    这种机制可以适用任何类型的creator,但new类型的creator是最简单配置的. 3.2 Security Creator可以配置类的成员函数的访问权限.creator有授权访问(指明可以被访问的方法)和拒绝访问(指明不允许访问的方法)两种配置...

    Hibernate 中文 html 帮助文档

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session...

    HibernateAPI中文版.chm

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual...

    hibernate3.2中文文档(chm格式)

    1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual...

    hibernate 体系结构与配置 参考文档(html)

    编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)...

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包2

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

Global site tag (gtag.js) - Google Analytics