`
jefferent
  • 浏览: 80242 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ClassLoader体系结构

 
阅读更多

一、4类ClassLoader
(1) Bootstrap ClassLoader/启动类加载器
     主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.
(2) Extension ClassLoader/扩展类加载器
     主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作
(3) System ClassLoader/系统类加载器
     主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.
(4) User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
     在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

 

二、类加载器的特性:
1. 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
2. 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 ” 双亲委派的加载链 ” 结构.

    如下图:

 

    类图如下:

    类图中, BootstrapClassLoader是一个单独的java类,其实在这里,不应该叫他是一个java类。因为它已经完全不用java实现了(c++实现)。它是在jvm启动时,就被构造起来的,负责java平台核心库。启动类加载实现bootstrap classLoader类加载原理探索。
    自定义类加载器加载一个类的步骤:

    ClassLoader 类加载逻辑分析,以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:

// 检查类是否已被装载过
Class c = findLoadedClass(name);
if (c == null ) {
     // 指定类未被装载过
     try {
         if (parent != null ) {
             // 如果父类加载器不为空, 则委派给父类加载
             c = parent.loadClass(name, false );
         } else {
             // 如果父类加载器为空, 则委派给启动类加载加载
             c = findBootstrapClass0(name);
         }
     } catch (ClassNotFoundException e) {
         // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其
         // 捕获, 并通过findClass方法, 由自身加载
         c = findClass(name);
     }
}

 

    用Class.forName加载类,Class.forName使用的是被调用者的类加载器来加载类的.这种特性, 证明了java类加载器中的名称空间是唯一的, 不会相互干扰.即在一般情况下, 保证同一个类中所关联的其他类都是由当前类的类加载器所加载的.

public static Class forName(String className)
     throws ClassNotFoundException {
     return forName0(className, true , ClassLoader.getCallerClassLoader());
}
 
private static native Class forName0(String name, boolean initialize,
ClassLoader loader)
     throws ClassNotFoundException;

 

上图中 ClassLoader.getCallerClassLoader 就是得到调用当前forName方法的类的类加载器
 
线程上下文类加载器
    java默认的线程上下文类加载器是 系统类加载器(AppClassLoader).

// Now create the class loader to use to launch the application
try {
    loader = AppClassLoader.getAppClassLoader(extcl);
} catch (IOException e) {
    throw new InternalError(
"Could not create application class loader" );
}

 

    以上代码摘自sun.misc.Launch的无参构造函数Launch()。使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.
    大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。还有一些采用 hotswap 特性的框架, 也使用了线程上下文类加载器, 比如 seasar (full stack framework in japenese).
线程上下文从根本解决了一般应用不能违背双亲委派模式的问题.

 

使java类加载体系显得更灵活.
    随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,在编写基础设施时, 通过使用线程上下文来加载类, 应该是一个很好的选择.

    当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,防止因为不同的类加载器, 导致类型转换异常(ClassCastException).

 

分享到:
评论

相关推荐

    classloader体系结构(含hotswap)

    重温java之classloader体系结构(含hotswap) 启动类加载器 扩展类加载器 系统类加载器

    java ClassLoader机制及其在OSGi中的应用

    内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:

    Java虚拟机和Java程序的生命周期?

    提供了访问该类在方法去内的数据结构的接口。 类加载有类加载器完成: 类加载器分为:Java虚拟机自带的加载器和用户自定义的类加载器; Java虚拟机自带的类加载器包括:启动类加载器,扩展类加载器,系统类加载器三...

    基于JAVA的学生通讯录管理系统设计和实现[文献综述].doc

    它具有 简洁、安全、面向对象、动态、体系结构中立、可移植、分布式、平台无关性等多个优 点,被广泛地运用到计算机、便携式计算机、电视、电话、手机和其他大量设备上。Ja va的前景被广泛地看好,并有许多相关机构...

    JavaSetup8u101.zip 编程工具

    这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。 Java是全能的!!!...

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

    1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 ...

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

    1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ 大型公司面试必答之数据结构与算法(一)-达摩老师.mp4 │ 大型公司面试必答之数据结构与算法(二).mp4 │ ├─面试必问-JVM性能调优 │ JVM性能调优 2018-10-25.mp4 │ ├─面试必问-mybaits源码分析 │ │ ...

    Java经典入门教程pdf完整版

    JEE体系结构提供屮间层集成框架来满足无需太多费用而又需要高可用性、高可靠性以 及可扩展性的应用的需求。通过提供统的开发平台,J降低了开发多层应用的费用和复 杂性,同时提供对现有应用稈序集成强有力支持,完全...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics