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;

        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
             . . .
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值