黑马程序员技术交流社区

标题: 关于类加载器的理解 [打印本页]

作者: 梁宝昌    时间: 2014-9-10 21:18
标题: 关于类加载器的理解
10,类加载器:
类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码
(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。基本上所有的类加载器都是 java.lang.ClassLoader类
的一个实例。java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个
Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。
每一个类都有自己的类加载器,由于加载进内存,系统默认的类加载器有三种:Bootstrap(c++编写),ExtClassLoader,AppClassLoader,
一般当前线程会调用自己的类加载器加载线程,如果类A中引用了类B,则jvm会调用类A的类加载器加载类B,也可以自己创建加载器加载;当前类调用自己的类加
载器加载,会先委托父类加载器加载,父类也会委托自己的父 类加载器加载,如果都没加载到,则返回当前类的类加载器,还是没加载到,则报错,不会去找
子类;
<1> 加载的三个步骤:1,装载:查找和导入class文件。
       2,链接:其中解析步骤是可以选择的
     (a)检查:检查载入的class文件数据的正确性
     (b)准备:给类的静态变量分配存储空间
     (c)解析:将符号引用转成直接引用
       3,初始化:对静态变量,静态代码块执行初始化工作
<2> ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包
<3> AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader
是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类
<4>,Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及
引用的类也由这个ClassLoder载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点
是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.
String永远是由根装载器来装载,避免以上情况发生 除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文
件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2