`
cnetwei
  • 浏览: 174419 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java中的Classloader

 
阅读更多

Java中的Classloader简介

 

Java程序并不是本地可执行程序,它运行时首先启动JVM(Java虚拟机),然后把类(由Java源码编译生成的class)文件装载到JVM中,再运行。负责装载类文件的程序叫——ClassLoader,我们把装载类文件的方式、方法称为Java的类装载机制。

ClassLoader的组成与结构

ClassLoader的组成结构是JVM在安全性和网络移动性上发挥重要作用的一个方面,所谓一图胜千言,让我们从下图开始了解其组成结构吧:

 

共有4中不同类型的ClassLoader,它们会分别加载不同路径下的类文件,以下是它们的简单说明:

  1. BootstrapLoader(启动类装载器) :是JVM本地代码实现的一部分,负责加载核心Java类库——位于%JAVA_HOME%\jre\lib\下的*.jar文件,大部分都是以java.*作为包的类,在执行java.exe时可以使用-Xbootclasspath选项或-Dsun.boot.class.path选项,指定要附加加载的类。
  2. ExtensionLoader(扩展类装载器) :它由启动类装载器(BootstrapLoader)加载,负责装载扩展类库——位于%JAVA_HOME%\jar\lib\ext\目录下,或java.ext.dirs属性指定位置的*.jar文件,大部分都是以javax.*作为包头开始的类。
  3. AppClassLoader(应用程序类装载器) :由启动类装载器(BootstrapLoader)加载,负责加载应用程序自身的类—— CLASSPATH环境变量、 -classpath命令行选项、或者java.class.path属性 所指向位置的jar包和类件。在程序中通过ClassLoader.getSystemClassLoader 方法 可以得到到该加载器。
  4. CustomClassLoader(用户自定义类装载器) :这是JVM类装载机制表现最灵活的部分,由开发者决定,可以从任何可能的位置读取.class文件并加载,例如可以通过网络动态加载类文件并执行。

以上4中类型的加载器互为父子关系,下层的子加载器会委托上层的父加载器加载某类,如果父加载器找不到(指定类),则子加载器尝试自己,这被称为委托加载模型 。该模型使得BootstrapLoader会抢先于ExtensionLoader之前去加载类,而ExtensionLoader会抢在AppClassLoader之前,AppClassLoader会抢在用户自定义类加载器之前,这有效的守护了被信任类库的边境,可以防止恶意代码伪装成基本类库。
在类加载过程中还在遵守一个原则——全盘负责原则 ,是指当某ClassLoader载入一个类时,该类所依赖和引用的所有类也会由该ClassLoader负责加载,除非显式使用另外的ClassLoader。

最后达到的结果是:安全分隔 ——在多个ClassLoader之间,每个ClassLoader都拥有自己的命名空间(NameSpace) 用于分隔彼此加载的类对象,也就是说所有被加载的类只能看到被同一个ClassLoader装载的 别的类,这达到了安全分隔的目地

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics