1、什么叫做bootstrap?作为形容词有依靠自己力量的;自己做的等意思,在我们计算机世界里,一般指的是自举,引导,引导程序。
那什么是bootstrapClassLoader呢?它是引导加载器,也是最原始的加载器,它是干什么 事情的呢?它负责加载整个java的核心类。
它的父类是什么?它是没有父类的,是由jvm创建的
Java提供了动态的装载特性;它会在运行时的第一次引用到一个class的时候对它进行装载和链接,而不是在编译期进行。JVM的类装载器负责动态装载。Java类装载器有如下几个特点:
public static void main(String[] args) {
java.net.URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i]);
}
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/resources.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/rt.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/sunrsasign.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/jsse.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/jce.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/charsets.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/lib/modules/jdk.boot.jar
file:/D:/Program%20Files/Java/jdk1.6.0_23/jre/classes
2、什么是extensionClassLoader扩展类加载器
System.out.println(System.getProperty("java.ext.dirs"));
ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());
D:\Program Files\Java\jdk1.6.0_23\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
the parent of extension classloader : null
实际上他才是java里边的原始类加载器,它是由bootstrapClassLoader加载的,但是他的父类不是bootStrapClassLoader,因为booStrapClassLoader不是一个java对象。。。
3、什么是systemClassLoader呢?
如果说bootstrap class loader和extension class loader负责加载的是JVM的组件,那么system class loader负责加载的是应用程序类。它负责加载用户在$CLASSPATH里指定的类。
每个类装载器都有一个自己的命名空间用来保存已装载的类。当一个类装载器装载一个类时,它会通过保存在命名空间里的类全局限定名(Fully Qualified Class Name)进行搜索来检测这个类是否已经被加载了。如果两个类的全局限定名是一样的,但是如果命名空间不一样的话,那么它们还是不同的类。不同的命名空间表示class被不同的类装载器装载。
顾名思义,类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 bootstrap是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。如java.lang.Object是由bootstrap装载的。
Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。 System Class Loader是一个特殊的用户自定义类装载器,由JVM的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过ClassLoader.getSystemClassLoader() 方法得到。每个类装载器都有自己的命名空间,其中维护着由它装载的类型。所以一个Java程序可以多次装载具有同一个全限定名的多个类型。这样一个类型的全限定名就不足以确定在一个Java程序可以多次装载具有同一个全限定名的多个类型。因此,当多个类装载器都装载了同名的类型时,为了唯一地标识该类型,还要在类型名称前面加上一个装载该类型(指出了他所位于的命名空间)的类装载器的标识。java虚拟机中的命名空间,其实是解析过程的结果。对于每个被装载的类型,Java虚拟机都会记录装载它的类装载器,当虚拟机解析一个类到另一个类的符号引用时,他需要被引用类的类装载器。