java.lang.Object | +----java.lang.ClassLoader
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;
}
}
Class 类的一个实例。
不推荐使用该方法。
Class 类的一个实例。
protected ClassLoader()
如果有一安全管理器,则调用它的 checkCreateClassLoader 方法。可能返回安全性异常。
public Class loadClass(String name) throws ClassNotFoundException
loadClass 方法。
ClassLoader 的每个继承类都必须定义此方法。
类装载器应使用一个哈希表(hashtable)或其它的缓冲器,以避免多次定义同名类。
Class 对象名。
Class 对象,若没有找到则为 null
。
protected abstract Class loadClass(String name,
boolean resolve) throws ClassNotFoundException
如果 resolve 标记为 true,应对结果类调用
resolveClass 方法。
作为一抽象方法,ClassLoader 的继承类必须定义 loadClass() 方法。使用一哈希表(Hashtable), 能避免多次装载相同类。
Class 对象名。
Class 对象,若没有找到则为 null。
protected final Class defineClass(byte data[],
int offset,
int length)
Class 类的一个实例。
类必须解析之后才能使用。在以
"name" 作为第一个参数的版本中,不推荐使用此方法,此方法较安全。
Class 对象的字节数据。
Class 数据的起始位移。
Class 数据的长度。
Class 对象。
protected final Class defineClass(String name,
byte data[],
int offset,
int length)
Class 类的一个实例。 类必须解析之后才能使用。
Class 对象的字节数据。
Class 数据的起始位移。
Class 数据的长度。
Class 对象。
protected final void resolveClass(Class c)
true,则该方法应被 loadClass 方法调用。
Class 实例。
protected final Class findSystemClass(String name) throws ClassNotFoundException
系统类是以与平台有关的方式从局部文件系统中装载的类。它没有类装载器。
class 名。
protected final void setSigners(Class cl,
Object signers[])
protected final Class findLoadedClass(String name)
public static final InputStream getSystemResourceAsStream(String name)
资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。
public static final URL getSystemResource(String name)
资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。
public InputStream getResourceAsStream(String name)
类装载器能选择定位此资源。
public URL getResource(String name)
类装载器能选择定位此资源。