ClassLoad是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
每个 Class
对象都包含一个对定义它的 ClassLoader 的引用
。
数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader()
返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式。
类加载器通常由安全管理器使用,用于指示安全域。
ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作 ClassLoader 实例的父类加载器。
通常情况下,Java 虚拟机以与平台有关的方式,从本地文件系统中加载类。例如,在 UNIX 系统中,虚拟机从 CLASSPATH 环境变量定义的目录中加载类。
然而,有些类可能并非源自一个文件;它们可能源自其他来源(如网络),也可能是由应用程序构造的。defineClass
方法将一个 byte 数组转换为 Class 类的实例。这种新定义的类的实例可以使用 Class.newInstance
来创建。
类加载器所创建对象的方法和构造方法可以引用其他类。为了确定引用的类,Java 虚拟机将调用最初创建该类的类加载器的 loadClass
方法。
常见的方法有:
1)loadClass方法
protected Class<?> loadClass(String name,boolean reslove) throws ClassNotFoundException;
-
使用指定的
二进制名称来加载类。此方法的默认实现将按以下顺序搜索类:
-
调用
findLoadedClass(String)
来检查是否已经加载类。 -
在父类加载器上调用
loadClass
方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。 -
调用
findClass(String)
方法查找类。
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用
resolveClass(Class)
方法。鼓励用 ClassLoader 的子类重写
findClass(String)
,而不是使用此方法。 -
-
-
参数:
-
name
- 类的 二进制名称 -
resolve
- 如果该参数为 true,则分析这个类
返回:
- 得到的 Class 对象 抛出:
-
ClassNotFoundException
- 如果无法找到类
-
2)findClass方法
protected Class<?> findClass(String name) throws ClassNotFoundException
-
使用指定的
二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被
loadClass
方法调用。默认实现抛出一个 ClassNotFoundException。 -
-
参数:
-
name
- 类的 二进制名称
返回:
- 得到的 Class 对象 抛出:
-
ClassNotFoundException
- 如果无法找到类
-
@Deprecated protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
-
已过时。
由
defineClass(String, byte[], int, int)
取代 - 将一个 byte 数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。此方法已废弃,新版本将 二进制名称作为该类的第一个参数,后者更加安全。
-
-
参数:
-
b
- 组成类数据的字节。 off 与 off+len-1 之间的字节应该具有《 Java Virtual Machine Specification》定义的有效类文件的格式。 -
off
- 类数据的 b 中的起始偏移量 -
len
- 类数据的长度
返回:
- 从指定类数据创建的 Class 对象 抛出:
-
ClassFormatError
- 如果数据不包含有效类 -
IndexOutOfBoundsException
- 如果 off 或 len 为负,或者 off+len 大于 b.length。
-