上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是当中之中的一个。本篇博客就具体的对ClassLoader做一个相对深入的了解。

作为了解须要知道的是。事实上类类型(Class Class)是和ClassLoader分不开的。由于ClassLoader须要的信息是由它提供的。类类型将在下一篇博客介绍。

简单介绍     ClassLoader是负责载入类的对象。作用是依据Jvm请求提供的类信息。将请求的类载入的内存中或者说载入到Jvm中。

另外,每个类的Class对象(注意Class是类类型)都持有一个相应的ClassLoader的引用。

能够通过Class对象的getClassLoader()方法得到。类和它的ClassLoader是相应的。所以类仅仅能通过它相应的ClassLoader载入。
    注意数组类的 Class 对象不是由类载入器创建的。而是由 Java 执行时依据须要自己主动创建。数组类的类载入器由 Class.getClassLoader() 返回,该载入器与其元素类型的类载入器是同样的;假设该元素类型是基本类型,则该数组类没有类载入器。

分类     JVM在执行时会产生三个ClassLoader。Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。
    Bootstrap ClassLoader:是用C++编写的,是JVM的内置载入器,它的名字是null。它用来载入核心类库,即在lib下的类库。做个实验。首先,String类肯定是java的核心类。那我们就以它为例来看看:    
public static void main(String[] args){
		String a="x";
		System.out.println(a.getClass().getClassLoader());
	}
           我们通过代码来获得String载入相应的ClassLoader的名字输出的结果为NULL。
    Extension ClassLoader:载入lib/ext下的类库。
    App ClassLoader:载入Classpath里的类库。

层次关系     之前我们说过,每个Class对象都会持有一个相应的ClassLoader的引用。每个ClassLoader对象也会持有一个Parent ClassLoader的引用。这里须要特别注意的是:这里所指的的Parent ClassLoader不是我们熟悉的继承关系,不是父类。!

首先。我们要知道这里说的是ClassLoader对象,也就是说这的Parent ClassLoader事实上是一个对象的引用。以下看一张图。了解一下ClassLoader对象之间的层次关系:

     java反射机制剖析(二)— Class Loader_类类型     


      我们这里能够在做一个实验,来体会一下这个层次关系。代码例如以下:
         
public static void main(String[] args){		
		ClassLoader c =TestClassLoader.class.getClassLoader();
		do {
			System.out.println(c.getClass().getName());
			c=c.getParent();
		}while(c!=null);		
	}
}
输出的结果为:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

双亲载入机制     层次关系中我们了解到了非常重要的一点:载入器对象之间的引用关系。被引用的对象称之为引用对象的父载入器。可以通过getParent()方法得到。

那么双亲载入机制就是基于这样的引用的层次关系。即:当一个ClassLoader接到请求时,它不是直接载入相应的类。而是询问它引用的ClassLoader是否可以载入。而这个父ClassLoader则会询问自己的引用的ClassLoader是否载入了该类。

仅仅有当全部的父ClassLoader都没有载入该类时,这个最初的ClassLoader才自己去载入申请的类。


    非常绕啊,文字说不清楚还是上图吧。

java反射机制剖析(二)— Class Loader_bootstrap_02

    双亲载入机制能够一定程度上保证安全性,由于仅仅要顶层ClassLoader能载入的东西就一定不会让下层的ClassLoader有机会载入。

也就保证了有些自己定义的带有破坏性的类不会被载入到Jvm核心中。
    结语:ClassLoader相对难理解的地方一个是,对象将的层次关系和父载入器。还有一个是双亲载入机制。

这里提供一个视频供大家參考。