热部署,名称空间,类装入器

所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
由于类装入器担负着把代码装入JVM的重任,所以它的体系结构应当保证整个平台的安全性不会受到威胁。每一个类装入器要为它装入的类定义一个独立的名称空间,因此运行时,一个类由它的包名称和装入它的类装入器两者结合唯一地标识。
在名称空间之外,类不可见,运行时不同名称空间的类之间有一种保护性的“隔离墙”,在Java 2向父类委托的类装入模式中,类装入器可以请求其父类装入器装入的类,因此类装入器需要的类不一定全部由它自己装入。
在Java运行环境中,不同的类装入器从不同的代码库装入类,之所以要将各个类装入器代码库的位置分开,是为了便于给不同的代码库设定不同的信任级别。在JVM中,由bootstrap类装入器装入的类具有最高的信任级别,用户自定义类装入器代码库的信任级别最低。此外,类装入器可以把每一个装入的类放入一个保护域,保护域定义了代码执行时所拥有的权限。 

如果要以系统安全策略(一个java.security.Policy的实例)为基础定义代码的权限,定制类装入器必须扩展java.security.SecureClassLoad类,调用其defineClass方法,SecureClassLoad类的defineClass方法有一个java.security.CodeSource参数。defindClass方法从系统策略获得与CodeSource关联的权限,以此为基础定义一个java.security.ProtectionDomain。详细介绍该安全模型已经超出了本文的范围,请读者自行参阅有关JVM内部机制的资料。

类装入器装入的最小执行单元是Java .class文件。Java .class文件包含Java类的二进制描述,其中有可执行的字节码以及该类用到的对其他类的引用,包括对Java标准API里面的类的引用。简单地说,类装入器首先找到要装入的Java类的字节码,读入字节码,创建一个java.lang.Class类的实例。做好这些准备之后,类就可以被JVM执行了。 
当JVM最初开始运行时,它里面不装入任何类。如果要求JVM执行一个程序,被执行的类首先装入,字节码执行期间会引用到其他类和接口,这些被引用到的类和接口随之也被装入。因此,有人把JVM的类装入方式称为“懒惰的”装入方式,即只有必须用到某个类时才会装入它(而不是预先装入各种可能用到的类),正因为如此,开始时JVM不必知道运行时要装入哪些类。在Java平台上,懒惰的装入方式是实现动态可扩展性机制的关键因素之一。在本文的后面,你将会看到通过实现一个定制的Java类装入器,我们可以为Java运行时环境加入许多有趣的功能
Java 2运行时环境中有多个类装入器的实例,每一个类装入器的实例从不同的代码库装入Java类。例如,Java核心API类由bootstrap(或primordial)类装入器装入,应用程序的类由system(或application)类装入器装入。另外,应用程序可以自定义类装入器从指定的代码库装入类。Java 2定义了类装入器之间的父-子关系,每一个类装入器(bootstrap除外)都有一个父类装入器,形成一个由类装入器构成的树形结构,bootstrap类装入器是这个树形结构的根,因此bootstrap没有父类装入器。
当客户程序请求类装入器装入某个类时,类装入器按照下面的算法装入一个类:

 首先执行一次检查,查看客户程序请求的类是否已经由当前的类装入器装入。如果是,则返回已装入的类,请求处理完毕。JVM缓冲了类装入器装入的所有类,已经装入的类不会被再次装入。

⑵ 如果尚未装入类,则装入类的请求被委托给父类装入器,这个操作发生在当前的类装入器尝试装入指定的类之前。委托装入类的操作一直向上传递,直至bootstrap类装入器,如前所述,bootstrap类装入器是处于树形结构的顶层,它不再有可委托的父类装入器。 
⑶ 如果父类装入器未能装入指定的类,则当前的类装入器将尝试搜索该类。每一个类装入器有预定义的搜索和装入类的位置。例如,bootstrap类装入器搜索sun.boot.class.path系统属性中指定的位置(包括目录和zip、jar文件),system类装入器搜索的位置由JVM开始运行时传入的CLASSPATH命令行变量指定(相当于设置java.class.path系统属性)。如果找到了类,则类装入器将类返回给系统,请求处理完毕。
 如果找不到类,则抛出java.lang.ClassNotFoundException异常。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值