您的位置:首页 > 其它

ClassLoader常见方法汇总

2015-10-17 20:42 295 查看
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
- 如果无法找到类
3)defineClass方法
@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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: