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

       我们知道类加载的作用是,它负责将.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自己实现的,看下面的代码:

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());

		}
	}
}

              运行上面的代码结果如下

     温故知新之__Java类加载器(一)_第1张图片

    我们之所以能够使用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包和类路径。

        

   

     

你可能感兴趣的:(Java)