ClassLoader类的原理
Posted zhaozheng7758
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClassLoader类的原理相关的知识,希望对你有一定的参考价值。
一个ClassLoader(以下称类加载器) 是一个对象,它负责加载类。ClassLoader类是一个Abstract 类。
如果给了一个类的名字,那么类加载器将会去加载和生成有关构成这个类的定义的数据。典型的策略是将这个类名转换成一个文件名,然后从文件系统中读取这个类文件名。
每个类对象都有一个对其自身类进行定义的类加载器的引用(reference)
多个数组类的类对象不能由类加载器创建,但它们可以根据需要,由java 运行时(runtime)自动创建。针对一个数组类通过Class.getClassLoader()来返回它的类加载器,这个过程和与返回数组里面的元素的类加载器的过程是一样的。但是,如果数组的元素是基本类型(primitive type)的,那么这个数组就没有类加载器。
应用程序为了能具有扩展(extend)JVM动态加载类的能力,它需要实现(implement)类加载器的子类。
类加载器的典型使用是由安全管理者来指定安全域。
一个ClassLoader 类,使用委托(delegation model)模型来查找类和资源。每个ClassLoader 类的实例都有一个向上一级的(父亲)类加载器)的联接。当需要查找类或资源的时候,一个ClassLoader 实例在亲自查找这些资源之前,先将查找任务委托给它的父加载器。在类加载器内部构建虚拟机的类加载器,称为“bootstrap 类加载器”,它本身没有父加载器,但它却可以充当一个ClassLoader 实例的父亲。
通常由JVM从一个由(操作系统)平台支撑的本地文件系统中加载类对象。例如:在 Unix 系统中,文件的路径由CLASSPATH 环境变量定义,JVM 加载类就是从这个路径中提取。
然而,有些类并不存在于一个本地文件,他们可能来自其它的来源,如它们可能来源于网络,也可能由一个应用程序(动态)创建。defineClass()方法 将一个字节数组转换为一个Class类的实例,这个实例可以由Class.newInstance()创建。
由类加载器创建的对象的方法和构造器(constructor)可以引用其它的类。为了确定要引用的类,JVM触发类加载器的loadClass()方法。
例如:一个应用程序可以创建一个网络类加载器,使其能够从服务器端虾子类文件。代码可以如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
这个网络类加载器子类从网络上加载类,必须定义findClass()方法和loadClassData()方法。一旦它下载了足够的字节,能够组成这个被加载的类,它就会使用defineClass()方法来创建这个类的实例。类加载器实现样例如下:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
如果给了一个类的名字,那么类加载器将会去加载和生成有关构成这个类的定义的数据。典型的策略是将这个类名转换成一个文件名,然后从文件系统中读取这个类文件名。
每个类对象都有一个对其自身类进行定义的类加载器的引用(reference)
多个数组类的类对象不能由类加载器创建,但它们可以根据需要,由java 运行时(runtime)自动创建。针对一个数组类通过Class.getClassLoader()来返回它的类加载器,这个过程和与返回数组里面的元素的类加载器的过程是一样的。但是,如果数组的元素是基本类型(primitive type)的,那么这个数组就没有类加载器。
应用程序为了能具有扩展(extend)JVM动态加载类的能力,它需要实现(implement)类加载器的子类。
类加载器的典型使用是由安全管理者来指定安全域。
一个ClassLoader 类,使用委托(delegation model)模型来查找类和资源。每个ClassLoader 类的实例都有一个向上一级的(父亲)类加载器)的联接。当需要查找类或资源的时候,一个ClassLoader 实例在亲自查找这些资源之前,先将查找任务委托给它的父加载器。在类加载器内部构建虚拟机的类加载器,称为“bootstrap 类加载器”,它本身没有父加载器,但它却可以充当一个ClassLoader 实例的父亲。
通常由JVM从一个由(操作系统)平台支撑的本地文件系统中加载类对象。例如:在 Unix 系统中,文件的路径由CLASSPATH 环境变量定义,JVM 加载类就是从这个路径中提取。
然而,有些类并不存在于一个本地文件,他们可能来自其它的来源,如它们可能来源于网络,也可能由一个应用程序(动态)创建。defineClass()方法 将一个字节数组转换为一个Class类的实例,这个实例可以由Class.newInstance()创建。
由类加载器创建的对象的方法和构造器(constructor)可以引用其它的类。为了确定要引用的类,JVM触发类加载器的loadClass()方法。
例如:一个应用程序可以创建一个网络类加载器,使其能够从服务器端虾子类文件。代码可以如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
这个网络类加载器子类从网络上加载类,必须定义findClass()方法和loadClassData()方法。一旦它下载了足够的字节,能够组成这个被加载的类,它就会使用defineClass()方法来创建这个类的实例。类加载器实现样例如下:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
以上是关于ClassLoader类的原理的主要内容,如果未能解决你的问题,请参考以下文章