Java类加载器


        Java是介于编译型和解释型之间的编程语言,编译器将java源代码编译成中间层字节码文件(bytecode),由Java虚拟机(Java Virtual Machine)解释和执行之。Java体系结构可以表示如下:



        由上图可知类加载器是JVM的一部分,主要作用是将字节码加载进入执行引擎,以供执行。当使用java A 的时候,java.exe被调用,从而根据%JAVA_HOME%/jre/lib/i386/jvm.cfg配置来选择激活jvm,启动之后初始化工作 完成之后便产生Bootstrap Loader加载器,它由C++编写。JVM中另外两个内置类加载器是ExtClassLoader和AppClassLoader,它们定义在 sun.misc.Launcher.class中,为内部类,且由Bootstrp Loader加载进入虚拟机。
        每个类加载器会根据预设的url来搜索.class文件并动态加载之。Bootstrap Loader的加载路径为sun.boot.class.path,表现为CLASS_PATH环境变量;ExtClassLoader加载路径为 java.ext.dirs,默认是%JAVA_HOME%/jre/lib/ext;AppClassLoader加载路径为 java.class.path,由执行java.exe时的-classpath或-cp参数指定;上述三个类加载器存在下图所示的继承关系:



        同时,上图还说明了类加载器在Java语言中发挥的很重要的2点作用:
        1、类加载器的委派模型:假设AppClassLoader需要加载一个类,它会首先委托其父加载器ExtClassLoader来加载此 类,ExtClassLoader也会递归性的委托其父加载器Bootstrap Loader来加载此类,如果Bootstrap Loader在sun.boot.class.path下找到被加载类时即加载,如果无法找到时再依次由子类加载器去加载。委派模型是针对Java安全而 设计的,这也印证了Java语言的设计初衷:面向网络的编程语言。
        2、由同一个类加载器所加载的类只能引用该加载器和其父加载器所加载的其他类。

        Java语言的的动态连接性:经编译后的.class文件对于JVM来说是一个独立的动态链接函数库,类似于Windows 操作系统下的动态联结函数库(Dynamic Linking Library)和Unix下的共享对象(Share Object)。动态连接特性使我们可以在Java程序被编译之后还能对源文件做修改,重新编译修改过的源文件且重启jvm即可更新被加载的.class 文件,在Tomcat之类的Web Container下实现的热部署(Hot Deployment)可以在不重启虚拟机的情况下更新.class文件。另,动态连接性可以显示的实现,有两种方法:1) Class clazz = Class.forName(); 2) 自定义类加载器,然后利用loadClass()加载.class; 上述两种方法可以在运行时动态加载.class文件。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值