ClassLoader常见方法汇总
2015-10-17 20:42
295 查看
ClassLoad是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
每个
ClassLoader 的
数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由
应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式。
类加载器通常由安全管理器使用,用于指示安全域。
ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作
ClassLoader 实例的父类加载器。
通常情况下,Java 虚拟机以与平台有关的方式,从本地文件系统中加载类。例如,在 UNIX 系统中,虚拟机从 CLASSPATH 环境变量定义的目录中加载类。
然而,有些类可能并非源自一个文件;它们可能源自其他来源(如网络),也可能是由应用程序构造的。
Class 类的实例。这种新定义的类的实例可以使用
类加载器所创建对象的方法和构造方法可以引用其他类。为了确定引用的类,Java 虚拟机将调用最初创建该类的类加载器的
常见的方法有:
1)loadClass方法
protected Class<?> loadClass(String name,boolean reslove) throws ClassNotFoundException;
使用指定的二进制名称来加载类。此方法的默认实现将按以下顺序搜索类:
调用
在父类加载器上调用
null,则使用虚拟机的内置类加载器。
调用
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用
鼓励用 ClassLoader 的子类重写
参数:
使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被
参数:
3)defineClass方法
已过时。 由
将一个 byte 数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。此方法已废弃,新版本将二进制名称作为该类的第一个参数,后者更加安全。
参数:
off 或 len 为负,或者 off+len 大于 b.length。
每个
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。
相关文章推荐
- struts2+ajax实现异步验证
- Fixing the Great Wall
- 深度学习理论解释基础
- Derek Bradley & Gerhard Roth自适应二值化算法, Opencv实现
- Eclipse中使用kindeditor插件
- 什么是JPS
- C#启动进程之Process
- C语言 简单程序
- leetcode 34:
- junit简单编写
- Github API JSON
- 第三次课堂例子截图
- Windows服务器下升级PHP版本的方法
- 一结(12)
- OC学习NSString与NSMutableString字符串
- Android Activity的生命周期详解
- poj 3260混合背包
- Hadoop2.6.0 mapreduce 例子
- Hadoop学习笔记(九)HDFS架构分析
- Linux下vim使用