黑马程序员技术交流社区

标题: 类加载器 [打印本页]

作者: 晓天s    时间: 2013-10-28 11:01
标题: 类加载器
类加载器
1、定义
类加载器就是加载类的工具。
2、作用
将.class文件中的内容变为字节码加载进内存,并为之生成对应的java.lang.Class对象。
3、默认类加载器:
        1)Java虚拟机中可安装多个类加载器,系统默认的有三个主要的,每个类负责加载特定位置的类:BootStrap、ExtClassLoader、AppClassLoader
        2)类加载器本身也是Java类,因为它是Java类的加载器,本身也需要被类加载器加载,显然必须有第一个类加载器而不是java类的,这正是BootStrap。它是嵌套在Java虚拟机内核中的,已启动即出现在虚拟机中,是用c++写的一段二进制代码。所以不能通过java程序获取其名字,获得的只能是null。
4、Java虚拟机中的所有类加载器采用父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
5、当JVM启动时,会形成由3个类加载器组成的初始类加载器层次结构。
(1)Bootstrap ClassLoader:根类加载器;它负责加载Java的核心类;它并不是java.lang.ClassLoader的子类,而是由JVM自身实现的,下面程序可以实现获取根类加载器所加在的核心类库。
[java] view plaincopy
public class BootstrapTest  
{  
    public static void main(String[] args)  
    {  
        // 获取根类加载器所加载的全部URL数组  
        URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();  
        // 遍历、输出根类加载器加载的全部URL  
        for (int i = 0; i < urls.length; i++)  
        {  
            System.out.println(urls[i].toExternalForm());  
        }  
    }  
}
(2)Extension ClassLoader:扩展类加载器;它负责加载JRE的扩展陌路中的JAR包中的类。
(3)System ClassLoader:系统类加载器;它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH环境变量所制定的JAR包和类路径。
6、类加载机制
JVM的类加载机制主要有如下三种机制:
(1)全盘负责:指当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其它Class也将有该类加载器负责载入,除非显式使用另外一个类加载器来载入;
(2)父类委托:指先让父类加载器视图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类;
(3)缓存机制:指所有加载过的Class都会被缓存,当程序中需要使用某个Class时候,类加载器先从缓存区中搜寻该Class,只有当缓存去中不存在
该Class对象时候,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区中。这就是为什么修改了Class后,必须重新启动JVM,
程序所做的修改才会生效的原因。
作者: heke    时间: 2013-10-28 11:14
(*^__^*) 嘻嘻……
作者: 迦南    时间: 2014-9-6 10:22
写的太好了,谢谢分享




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