类 java.lang.ClassLoader
java.lang.Object | +----java.lang.ClassLoader
-
public abstract class
ClassLoader
extends
Object
ClassLoader
是一个抽象类。为了扩充 Java 虚拟机动态装载类的方法,应用程序可实现 ClassLoader
的继承类。
通常,Java 虚拟机以与平台有关的方式,从局部文件系统中装载类。例如,在 UNIX 系统,虚拟机从 CLASSPATH
环境变量中定义的路径中装载类。
但是,某些类可能不是来自文件,而是来自其它资源,诸如网络,或者它们可能是由应用程序创建的。 defineClass
方法将一字节数组转换为 Class
类的实例。采用 Class
类中的 newInstance
方法创建新定义的类的实例。
类装载器创建的方法和构造子可以引用其它类。为确定引用类,Java 虚拟机调用初始创建该类的类装载器的 loadClass
方法。如果 Java 虚拟机仅需确定此类是否存在,和如果存在则如何获知它的父类,那么将 resolve
标记设为 false
。但是,如果该类的实例已创建,或它的方法已被调用,则必须解析该类。这种情况,resolve
标记设为 true
,调用 resolveClass
方法。
例如,一个应用程序能够创建一网络类装载器,从某一个服务器上下载类文件。代码可能如下:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
网络类装载器的子类必须定义 loadClass
方法,实现从网上下载类。一旦已下载完该类,就应使用 defineClass
方法,创建它的一个实例。实现示例如下:
class NetworkClassLoader { String host; int port; Hashtable cache = new Hashtable(); private byte loadClassData(String name)[] { // load the class data from the connection . . . } public synchronized Class loadClass(String name, boolean resolve) { Class c = cache.get(name); if (c == null) { byte data[] = loadClassData(name); c = defineClass(data, 0, data.length); cache.put(name, c); } if (resolve) resolveClass(c); return c; } }
-
来自:
- JDK1.0 参见:
- Class, newInstance, defineClass, loadClass, resolveClass
构造子索引
-
ClassLoader()
- 构造一个新的类装载器并初始化它。
方法索引
-
defineClass(byte[], int, int)
-
将一字节数组转换为
Class
类的一个实例。 不推荐使用该方法。
defineClass(String, byte[], int, int)
-
将一字节数组转换为
Class
类的一个实例。
findLoadedClass(String)
findSystemClass(String)
- 用指定名查找系统类,如果必要装载之。 getResource(String)
- 用给定名查找资源。 getResourceAsStream(String)
- 获取给定资源的一 InputStream 类。 getSystemResource(String)
- 用给定名查找资源。 getSystemResourceAsStream(String)
- 获取给定资源的一 InputStream 类。 loadClass(String)
- 申请类装载器,装载并解析给定名类。 loadClass(String, boolean)
- 将指定名解析为一 Class 对象。 resolveClass(Class)
- 为了创建类的实例,或调用它的方法,解析相应类。 setSigners(Class, Object[])
- 设置类标记。
构造子
ClassLoaderprotected ClassLoader()
-
构造一个新的类装载器并初始化它。
如果有一安全管理器,则调用它的
checkCreateClassLoader
方法。可能返回安全性异常。 -
-
抛出:
SecurityException
- 如果当前线程不允许创建一新类装载器。 参见:
- SecurityException, checkCreateClassLoader
方法
loadClasspublic Class loadClass(String name) throws ClassNotFoundException
-
申请类装载器,装载并解析给定名类。 当类装载器装入的类首次引用另一类时, Java 虚拟机调用
loadClass
方法。ClassLoader
的每个继承类都必须定义此方法。类装载器应使用一个哈希表(hashtable)或其它的缓冲器,以避免多次定义同名类。
-
-
参数:
-
name - 期望的
Class
对象名。
返回值:
-
结果
Class
对象,若没有找到则为null
。
抛出:
ClassNotFoundException
- 如果类装载器不能找到该类的定义。
-
name - 期望的
protected abstract Class loadClass(String name, boolean resolve) throws ClassNotFoundException
-
将指定名解析为一 Class 对象。 虚拟机调用 loadClass() 方法。
如果
resolve
标记为 true,应对结果类调用resolveClass
方法。作为一抽象方法,ClassLoader 的继承类必须定义 loadClass() 方法。使用一哈希表(Hashtable), 能避免多次装载相同类。
-
-
参数:
-
name - 期望的
Class
对象名。 - resolve - 如果不需要解析该 Class 则为 true. 返回值:
-
结果
Class
对象,若没有找到则为null
。
抛出:
ClassNotFoundException
- 如果类装载器不能找到该类定义。 参见:
- Hashtable
-
name - 期望的
protected final Class defineClass(byte data[], int offset, int length)
- 注释:不推荐使用 defineClass() 方法。 用 defineClass(java.lang.String, byte[], int, int) 方法替换。
-
将一字节数组转换为
Class
类的一个实例。 类必须解析之后才能使用。在以 "name" 作为第一个参数的版本中,不推荐使用此方法,此方法较安全。 -
-
参数:
-
data - 组成
Class
对象的字节数据。 -
offset -
Class
数据的起始位移。 -
length -
Class
数据的长度。
返回值:
-
以 data 创建的
Class
对象。
抛出:
ClassFormatError
- 如果数据不包括合法类。 参见:
- loadClass, resolveClass
-
data - 组成
protected final Class defineClass(String name, byte data[], int offset, int length)
-
将一字节数组转换为
Class
类的一个实例。 类必须解析之后才能使用。 -
-
参数:
- name - 期望的类名;若未知则为 null;使用 '.' 而不是 '/' 作为分隔符,结尾没有 ".class" 后缀。
-
data - 组成
Class
对象的字节数据。 -
offset -
Class
数据的起始位移。 -
length -
Class
数据的长度。
返回值:
-
以 data 创建的
Class
对象。
抛出:
ClassFormatError
- 如果数据不包括合法类。 参见:
- loadClass, resolveClass
protected final void resolveClass(Class c)
-
为了创建类的实例,或调用它的方法,解析相应类。 如果解析标志为
true
,则该方法应被loadClass
方法调用。 -
-
参数:
-
c - 解析的
Class
实例。
参见:
- defineClass
-
c - 解析的
protected final Class findSystemClass(String name) throws ClassNotFoundException
-
用指定名查找系统类,如果必要装载之。
系统类是以与平台有关的方式从局部文件系统中装载的类。它没有类装载器。
-
-
参数:
-
name - 系统
class
名。
返回值:
- 给定名的系统类。 抛出: ClassNotFoundException
- 如果不能找到该类定义。 抛出: NoClassDefFoundError
- 如果不能找到此类。
-
name - 系统
protected final void setSigners(Class cl, Object signers[])
- 设置类标记。 通过已知的类装载代码,定义一个类后再调用该方法。
protected final Class findLoadedClass(String name)
public static final InputStream getSystemResourceAsStream(String name)
-
获取给定资源的一 InputStream 类。 若没有相应的资源,则返回 null。
资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。
-
-
参数:
- name - 资源名,作为将被使用的。 返回值:
- 一资源的 InputStream 对象,如果不能找到则为 null。
public static final URL getSystemResource(String name)
-
用给定名查找资源。 返回值是一资源的 URL,使用它调用 getContent() 方法,可能返回一个图象、一段音频剪辑(AudioClip)或一个 InputStream 对象。
资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。
-
-
参数:
- name - 资源名,作为将被使用的。 返回值:
- 资源的 URL 值,如果不能找到对应资源则为 null。
public InputStream getResourceAsStream(String name)
-
获取给定资源的一个 InputStream。若没有相应的资源,则返回 null。
类装载器能选择定位此资源。
-
-
参数:
- name - 资源名,作为将被使用的。 返回值:
- 一资源的 InputStream 对象,如果不能找到则为 null。
public URL getResource(String name)
-
用给定名查找资源。 返回一资源的 URL 值。使用它调用 getContent() 方法,可能返回一个图象、一段音频剪辑(AudioClip)或一个 InputStream 对象。
类装载器能选择定位此资源。
-
-
参数:
- name - 资源名,作为将被使用的。 返回值:
- 一资源的 InputStream 对象,如果不能找到则为 null。