Java
虚拟机中的类加载器分为两种:原始类加载器(primordial class loader
)和类加载器对象(class loader objects
)。
原始类加载器是Java
虚拟机实现的一部分,类加载器对象是运行中的程序的一部分。不同类加载器加载的类被不同的命名空间所分割。
类加载器调用了许多Java
虚拟机中其他的部分和java.lang
包中的很多类。比如,类加载对象就是java.lang.ClassLoader
子类 的实例,ClassLoader
类中的方法可以访问虚拟机中的类加载机制;每一个被Java
虚拟机加载的类都会被表示为一个 java.lang.Class
类的实例。像其他对象一样,类加载器对象和Class
对象都保存在堆中,被加载的信息被保存在方法区中。
1
、加载、连接、初始化(Loading, Linking and
Initialization
)
类加载子系统不仅仅负责定位并加载类文件,他按照以下严格的步骤作了很多其他的事情:(具体的信息参见第七章的“
类的生命周期”
)
1
)、加载:寻找并导入指定类型(类和接口)的二进制信息
2
)、连接:进行验证、准备和解析
①
验证:确保导入类型的正确性
②
准备:为类型分配内存并初始化为默认值
③
解析:将字符引用解析为直接饮用
3
)、初始化:调用Java
代码,初始化类变量为合适的值
2
、原始类加载器(The Primordial Class Loader
)
每个Java
虚拟机都必须实现一个原始类加载器,他能够加载那些遵守类文件格式并且被信任的类。但是,Java
虚拟机的规范并没有定义如何加载类,这由 Java
虚拟机实现者自己决定。
对于给定类型名的类型,原始加载器必须找到那个类型名加“.class”
的文件并加载入虚拟机中。
3
、类加载器对象
虽然类加载器对象是Java
程序的一部分,但是ClassLoader
类中的三个方法可以访问Java
虚拟机中的类加载子系统。
1
)、protected final Class defineClass(…)
:使用这个方法可以出入一个字节数组,定义一个新的类型。
2
)、protected Class findSystemClass(String name)
:加载指定的类,如果已经加载,就直接返回。
3
)、protected final void resolveClass(Class c)
:defineClass()
方法只是加载一个类,这个方法负责后续的动态连接和初始化。
4
、命名空间
当多个类加载器加载了同一个类时,为了保证他们名字的唯一性,需要在类名前加上加载该类的类加载器的标识。