类加载机制

类加载过程

类加载器

  1. 类加载器是实现‘通过类的权限定名获取其二进制字节流’的代码模块
  2. 对于任何一个类,其唯一性由加载它的类加载器和这个类本身共同确定
  3. eclipse中运行java web程序时,应该是有两个类加载器,java本身的和tomcat的
  4. 分类
    1. 启动类加载器,默认路径<JAVA_HOME>/lib,或由-Xbootclasspath设定,并且是按照文件名加载的,如rt.jar,java程序无法直接使用
    2. 扩展类加载器,默认路径<JAVA_HOME>/lib/ext或由java.ext.dirs设定
    3. 应用程序类加载器,加载用户的classpath,最常用,ClassLoadergetSystemClassLoader()返回它
    4. 自定义类加载器,重写3中的类加载器
  5. 双亲委派模型(Parent Delegate Model)
    1. 类加载器使用组合(composition)关系复用‘父类’的加载器
    2. 如果一个类加载器接到类加载请求,不会直接尝试加载这个类,而是把请求委派给父类加载器去完成,直到最顶层,父类反馈自己无法加载,子类再去尝试加载
    3. java类随着其加载器有了优先级树形层次结构,这样更安全,比如重写rt.jar中的类将无法被加载,因为root加载器只加载指定目录和文件名中的类
    4. 双亲委派模型不是强制的,只是java的建议
    5. 随着对程序动态性的需求的兴起,如代码热替换,模块热部署,即想让代码想优盘一样即插即用,双亲委派模型不断被‘破坏’
    6. OSGi是’事实上’的java模块化标准,OSGi实现模块化热部署的关键就是其自定义的类加载器,每个程序模块(OSGi称为bundle)都有各自的类加载器,当需要更换bundle时,就把bundle连同类加载器一起换掉…
    7. OSGi中的类加载器是一个网状结构…
TOP