javaSE之类加载器
类加载器,说白了就是加载类的呵呵
.类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象
.当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
BootStrap----------JRE/lib.jar 根节点类加载器
ExtClassLoader-----------JRE/lib/ext/*.jar 扩展类加载器
AppClassLoader-----------CLASSPATH指定的所有jar或目录 应用类加载器也叫系统加载器
BootStrap classloader: 引导(也称原始)类加载器,他负责加载java的核心类(也就是JDK自带类)
这个加载器是非常特殊的,它实际上不是java.lang.ClassLoader的子类,而是由 JVM自身实 现的。可以通过执行一下代码来获得bootstrap classloader 加载了哪些
核心类库:
URL[] urls = sun.misc.Launcher. getBootstrapClassPath (). getURLs ();
for ( int i = 0; i < urls.length ; i ++) {
System. out .println ( urls [ i ]. toExternalForm ());
}
extension classloader: 扩展类加载器,它负责加载JRE的扩展目录中的jar包,这为引入除java核心类以外的新功能
提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的所
以,放入这个目录的JAR类包对所有的JVM和system classloader都是可见的。。
(systemm)App classloader: 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的
classpath或者java.class.path系统属性或者CLASSPATH操作系统属性所指定
的JAR类包和类路径
全盘负责委托机制:
全盘负责:当一个classloader加载一个class的时候,这个classs所依赖的和引用的其他class通常也由这个
classloader负责载入。
委托机制: 先让parent(父)类加载器寻找,只有在parent找不到的时候才从自己的类路径中寻找。
类加载器还采用了cache机制:
如果cache中保存了这个class就直接反悔它,如果没有才从文件中读取和转换成class,并存入cache,
这就是为什么修改class但是必须重新启动JVM才能生效,并且类指加载一次的原因
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐