您的位置:首页 > 编程语言 > Java开发

温故知新之__Java类加载器(一)

2015-10-25 22:52 435 查看
       我们知道类加载的作用是,它负责将.class文件加载到内存中,.class文件可能在本地磁盘中,或者网络上等,并且为之生成对应的Java.lang.Class对象。当一个类被载入JVM中后,同一个类就不会被再一次载入,那么JVM如何区别“同一个类”?

       其实不难想到,在对象中,对象存在一个唯一的标示一样,一个载入JVM的类也有唯一的标示,Java中一个类是使用全限定名(包名+类名)标示,在JVM中,一个类使用全限定名和其类加载器作为唯一的标识,例如:在包名com.test.Demo中有一个名称为Dog的类,被类加载器ClassLoader的实例CL1负责加载,则Dog类对应的Class对象在JVM中表示为(Dog,com.test.Demo,CL1),所以两个类加载器加载一个同名类,在JVM中表示也是不同的,互不兼容的。

       JVM在启动时,会形成三个类加载器组成的初始类加载器层次结构

       1.BootStrap ClassLoader:根类加载器

       2.Extension ClassLoader:扩展类加载器

       3.System ClassLoader:系统类加载器

       下面我们来看看每一个类加载器的作用:

        BootStrap ClassLoader 被称为引导加载器,有时也叫作原始或根加载器,它的作用是负责加载Java的核心类,它比较特殊,它并不是Java.lang.ClassLoader的子类,而是JVM自己实现的,看下面的代码:

<span style="font-family:System;font-size:18px;">public class Main {
public static void main(String[] args) {
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toExternalForm());

}
}
}</span>


              运行上面的代码结果如下

     


    我们之所以能够使用String,System这些核心类,因为这些核心类库都在file:/C:/Program%20Files/Java/jre1.8.0_45/lib/rt.jar文件中。

        extension ClassLoader是扩展类加载,他负责加载JRE的扩展目录(%JAVA_HOME%jre/lib/ext或者Java.ext.dirs系统属性指定的目录)中jar包的类,

       System ClassLoader 为系统类加载器,他负责加载在JVM启动时加载来自Java命令的-classpath选项,java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。

        

   

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: