“经过一个类的全限定名来获取描述此类的二进制字节流”这个动做放到java虚拟机外部去实现,以便让引用程序本身决定如何去获取所须要的类。实现这个动做的代码模块被称为类加载器。 java
类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中。通常来讲,Java 虚拟机使用 Java 类的方式以下:Java 源文件在通过 Javac以后就被转换成 Java 字节码文件(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。实际的状况可能更加复杂,好比 Java 字节代码多是经过工具动态生成的,也多是经过网络下载 网络
类加载器虽然只用于实现类的加载动做,但它在Java程序中起到的做用却远远不限于类加载阶段。对于任意一个类,都须要由加载它的类加载器和这个类自己一同确立其在Java虚拟中的惟一性。说通俗一些,比较两个类是否“相等”,只有在两个类是由同一个类加载器的前提之下才有意义,不然,即便这两个类来源于同一个class文件,只要加载它的类加载器不一样,那这两个类一定不相等。这里所指的“相等”包括表明类的Class对象的equal方法、isAssignableFrom()、isInstance()方法及instance关键字返回的结果。 工具
Bootstrap Loader - 负责加载系统类 spa
这个类加载器负责将存放在<java_home>\lib目录中的,或者被-xbootclasspath参数所指定的路径中的,而且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器没法被java程序猿直接引用。 .net
ExtClassLoader - 负责加载扩展类 对象
这个加载器负责加载<java_home>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的全部类库,开发者能够直接使用扩展类加载器 blog
AppClassLoader - 负责加载应用类 内存
这个类加载器是lassloader中的getsystemClassloader()方法的返回值,因此通常也成它为系统类加载器。负责加载用户类路径上所指定的类库,开发者能够直接使用这个类加载器,若是应用程序中没有自定义过本身的类加载器,通常状况下这个就是程序中的默认的类加载器。 ssl
若是一个类加载器收到了类加载的请求,它首先不会本身去加载这个类,而是把这个请求委派给父类加载器去完成,每个层次的类加载器都是如此,所以全部的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈本身没法完成这个加载请求时,子类加载器才会尝试本身去加载。 开发
参考:http://blog.csdn.net/java2000_wl/article/details/8222876