类装载器ClassLoader

    类装载器是寻找类的字节码(也就是class文件)文件并构造出类在JVM内部表示的对象组件。

 

    类装载器把一个类装入JVM三个步骤

1、装载:查找导入class文件

2、链接:校验、准备、解析(可选)

      校验:检查载入class文件的正确性

      准备:给类的静态变量分配存储空间

      解析:将符号引用转成直接引用

3、初始化:对静态变量、静态代码块执行初始化工作

 

      ClassLoader是java 的一个运行时系统组件,负责装载class文件。JVM运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)、AppClassLoader(系统类装载器)。这三个类存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader。

      其中根装载器不是ClassLoader的子类,它是用C++编写的,在java中找不到它,它负责装载jre的核心类库,如rt.jar、charsets.jar等。

      ExtClassLoader负责装载jre扩展目录下的jar包。

      AppClassLoader负责装载ClassPath路径下的类包。

 

      Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生。

 

       除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。

 

网上有个大牛有更详细的关于类装载器的介绍,网址http://blog.csdn.net/hudashi/article/details/7062850        http://blog.csdn.net/hudashi/article/details/7062849

 

你可能感兴趣的:(JVM,class,classloader,jvm)