关于ClassLoader

来源:互联网 发布:如何计算矩阵一致性 编辑:程序博客网 时间:2024/06/06 04:51

1、基础知识
开发阶段定义的类经编译后生成Class文件(二进制),里面保存类的描述信息。JVM当且仅当需要用到某个类时才将其对应的Class文件加载到内存中,而且只会加载一次。类的加载通过类加载器实现。常用的类加载器有四种:
(1) BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,位于JAVA_HOME/jre/lib目录下,如:rt.jar、resources.jar、charsets.jar等。不继承ClassLoader,底层由C++编写,内置于JVM中
(2) Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。继承ClassLoader
(3) App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。继承ClassLoader
(4) 自定义ClassLoader:继承ClassLoader,重写findClass方法
2、加载模型解读
(1)双亲委托模型
这里写图片描述
(2)源码分析类加载流程
这里写图片描述

3、实际使用
(1) 优先由最上层类加载器加载,基础的类比如String、Object等均由Bootstrap ClassLoader加载,通过这些类的对象获取的ClassLoader一般为null。注意ExtClassLoader.getParent返回的ClassLoader也为null
(2) 只加载一次,上层类加载器加载之后,下层不再重复加载,一个Class只会加载一次
(3) JVM如何唯一识别某个Class:所使用类加载器+full package name + className
(4) App ClassLoader(系统类加载器)加载Class并使用一般流程:根据类的全路径package name(*.java文件中import) + className 查找对应的Class文件,找到之后加载到内存中。该类所有实例对象的创建均来源于此Class。Class本身也是一个类,通过Class对象可以动态分析类的成员变量、属性、方法等,是反射技术的基础。

参考:http://blog.csdn.net/xyang81/article/details/7292380
http://blog.csdn.net/irelandken/article/details/7048817

原创粉丝点击