ClassLoader笔记

一、数组类的对象加载

数组类的对象不是由类创建的加载程序,但会根据Java运行时的要求自动创建。

数组类的类装入器,由Class.getClassLoader()与其元素的类装入器相同类型;如果元素类型是基元类型,则数组类没有类加载器。

二、自定义加载

1、应用程序实现类加载器的子类,以便扩展Java虚拟机动态加载的方式加载class。

2、安全管理员通常可以使用类装入器来指示安全域。

3、通常,Java虚拟机从本地文件加载类以依赖于平台的方式创建系统。例如,在UNIX系统上虚拟机从定义的目录加载类,类路径(CLASSPATH)环境变量。但是,有些类可能不是源于文件;它们可能起源于来自其他来源,例如网络,或者它们可以由ClassLoader.defineClass(String,byte[],int,int)方法将字节数组转换为类的实例。Class这个新定义的类的实例可以使用Class.newInstance方法转换。

类加载器创建的对象中的方法和构造函数可能参考其他class。要确定引用的类,Java虚拟机调用最初创建类的类装入器。例如,应用程序可以创建一个网络类加载器来从服务器下载类文件。示例代码可能如下所示:

 ClassLoader loader = new NetworkClassLoader(host,port);
 Object main = loader.loadClass("Main", true).newInstance();

网络类加载器子类必须定义ClassLoader.findClass()和ClassLoader.loadClassData()方法

加载类来自网络。一旦下载了组成类的字节,它应该使用ClassLoader.findClass()方法来创建一个类实例。示例代码:

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
              //连接加载类数据
          }
}

二进制名称(Binary name)作为String参数提供给方法的任何类名,类加载器必须有指定的名称才能加载文件,Java语言命名规范,有效类名示例:

"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"

三、类加载机制的委托模型

类加载器使用委托模型来搜索class和资源。类加载器的每个实例都有一个关联的父类加载器。当被要求查找类或资源,则类加载器实例将委托对在尝试查找前,将类或资源加载到其父类加载器类或资源本身。虚拟机的内置类加载器,称为“引导类装入器”,它本身没有父类,但可能充当类加载器实例的父级。

四、并行加载

支持类的并发加载的类加载器称为具有并行功能的类装入器(parallel capable),需要注册通过调用ClassLoader.registeraspallelable()方法。注意,ClassLoader类被注册为并行类默认情况下是有能力的。但是,它的子类仍然需要自己注册如果它们具有并行能力<br>在委派模型不严格适用的环境中分层的类加载器需要具有并行能力,否则类加载器装载可能会导致死锁,因为装载机锁是为类加载过程的持续时间,详细描述参见Class.loadClass()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值