java虚 拟机(JVM)的类装载就是将包含在类文件中的字节码装载到java虚拟机里来,但是类装载器也不是原封不动的装载到java虚拟机,它是将 (.class)文件中的内容转换成java虚拟机使用的类字节码,比如说,java程序中的字符串编译(.class)文件后是以UTF-8编码存放 的,但是装载到java虚拟机后就成了Unicode编码了。当通过类装载器装载到java虚拟机中的字节码数据,就成了可执行的代码。类装载器把类装入java虚拟机中,要经过三个步骤来完成:装载,链接和初始化。
它的实现方式可以是:

1.     类名.class,例如,System.class

2.     对象.getClass(),例如,new Date().getClass()

3.     Class.forName(“类名”),例如,Class.forName(“java.util.Date”);

类装载器本身也是一个java类,类库中提供了一个java.lang.ClassLoader做为类的装载器基类,也就是说真正的类装载器都必须是 ClassLoader的子类。Class类中定义了一个getClassLoader方法,用于返回它所描述的类的类装载器对象,这个返回对象的类型就 是ClassLoader。


一个java应用持续使用两种类型的类装载器:


1.     根装载器(bootstrap)

2.     用户定义的装载器(user-defined)


所谓根装载器(bootstrap)就是java虚拟机中内嵌的一个类,它 是用特定的操作系统的本地代码实现的,它不用专门的类装载器去进行装载。它负责加载java核心包中的类(jr.jar)文件中的类。其中Bootstrap Loader是由C++编写的,Java核心包 中还有ExtClassLoader和AppClassLoader,它们都是用java语言写的java类。


   其中ExtClassLoader类装载器负责加载存放在<JAVA_HOME>/JRE/LIB/EXT目录下的jar包中的类,AppClassLoader是负责加载存放在<CLASSPATH>用户定义的类。


当我们在命令行输入java Xxx(某个类)时候,java内部会做些什么动作呢?

 

 
Java Xxx
流程如下:
1.         找到JRE;
2.         找到JVM.dll;
3.         启动JVM,并进行初始化;
4.         产生Bootstrap Loader;
5.         载入ExtClassLoader;(Ext – Extended)
6.         载入AppClassLoader;
7.         加载Xxx类。
             类加载的时候遵循一个原则:“类加载器会依类的继承体系从上至下依次加载”。举个例子:“如果C继承了B并实现了接口I,而B有继承自A”,则类加载器在加载C时,加载的次序会是AàBàIàC,(注:interface会如同class一样被Java编译器编译为独立的.class文件)
 
 

一个已经被父级类装载器装载的类来说,java虚拟机默认也使用这个父级类装载器去装载它所调用的其他类,由于父级类装载器不会委托子级类装载器去装载类,所以,在一般情况下,一个已被父级类装载器装载的类无法调用那些只能用被子级类装载器发现和装载的其他的类。