ClassLoader常见方法汇总

来源:互联网 发布:网络捕鱼游戏平台大全 编辑:程序博客网 时间:2024/06/06 18:52

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;

使用指定的二进制名称来加载类。此方法的默认实现将按以下顺序搜索类:

  1. 调用 findLoadedClass(String) 来检查是否已经加载类。

  2. 在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。

  3. 调用 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 - 如果无法找到类
3)defineClass方法
@Deprecatedprotected final Class<?> defineClass(byte[] b,                                                int off,                                                int len)                              throws ClassFormatError
已过时。 defineClass(String, byte[], int, int) 取代

将一个 byte 数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。此方法已废弃,新版本将二进制名称作为该类的第一个参数,后者更加安全。

参数:
b - 组成类数据的字节。offoff+len-1 之间的字节应该具有《Java Virtual Machine Specification》定义的有效类文件的格式。
off - 类数据的 b 中的起始偏移量
len - 类数据的长度
返回:
从指定类数据创建的 Class 对象
抛出:
ClassFormatError - 如果数据不包含有效类
IndexOutOfBoundsException - 如果offlen 为负,或者 off+len 大于 b.length

0 0
原创粉丝点击