java开发笔记——classLoader

来源:互联网 发布:淘宝鹿与飞鸟 编辑:程序博客网 时间:2024/05/29 12:24

翻译:
class loader 是一个负责loading class的对象,ClassLoader是一个抽象类。当传入一个class的名称时,class loader会产生创建一个class的声明的数据,一个典型的策略是把传入的class名称转化成文件名称,然后从文件系统中查找到叫这个文件名的“class file“。

每一个Class都包含getClassLoader的引用,这个方法是在ClassLoader中定义它的。

Array classes 的对象不是由Class Loader创建的,而是由Java 运行时自动创建的。array class的class loader 是由array所属类型的getClassLoader返回的。如果其所属类型是基本类型,这个array class 就没有 class loader。

应用可以通过实现ClassLoader的subclassss中的接口,来拓展Java虚拟机动态加载类的功能。

class loaders 典型地用于安全管理器表明安全域。(不太懂,坐等大牛讲解)

ClassLoder 用委托模式来查到class和resource,每个ClassLoader的实例都关联一个父 class loader。当获取到一个查找class或者resource的请求时,ClassLoader的实例会在自己查找前先将这个请求委托给父class loader。虚拟机的内置的class loader ,被称为 “bootstrap class loader”,它本身没有父class loader,而作为class loader 实例的父 class loader。

通常地,java虚拟机配合不同平台文件系统的获取文件的习惯来load class。比如,在unix系统中,虚拟机从 ClassPath环境变量中定义的的目录来load class。

但是,一些class不是从文件系统中产生的,一些其他的渠道,比方说network,或者他们时应用构建的。方法defineClass(String,byte[],int,int) 把字节数组转化成class 实例,新定义的class可以用方法newInstance 来创建。

class loader 创建的一个Class的方法和构造奇可能引用其他class。为了定义这些应用的class,java虚拟机提供了loadClass方法来生成class。

举例说,应用要创建一个network的class loader从远端的server下载class 文件,代码如下:
ClassLoader loader= new NetworkClassLoader(host,port);
Object main= loader.loadClass(“Main”, true).newInstance();

  • 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
  • }
  • }
0 0