刍议Java动态类加载机制研究与应用
2016-07-10朱丹丹
目前计算机的运行可以说已经离不开Java编程体系,Java是指一种能够撰写跨平台的应用软件的面向其对象的程序设计语言。JVM(虚拟机)是Java编程体系的核心,而Java的动态类加载则是JVM的重要特征之一。本文就Java的动态类加载机制的研究与应用,浅要分析了Java的动态类加载器的原理与层次体系结构,以作参考。
【关键词】Java虚拟机 动态类加载机制 体系结构 研究应用
1 Java类加载的层次体系结构
Java中的所有类都是经由装载到jvm中的类加载器加载完成的,类加载器就是把类文件从硬盘读取到内存中。Java中的类可分为Java系统核心类。扩展类以及由程序员自定义的类;jvm的加载器也分为Bootstrap,classLoader,ExtClassLoader以及AppClassLoader,其分别对应的是加载Java的系统核心、扩展以及程序员自定义的应用类。另外,除了jvm默认的三个加载器,第三方如果有特殊的需求,也可以自己编写类加载器。就比如,如果需要加密指定目录的类,就只能用我们自己类的加载器才能解密加载。
2 Java动态类加载机制的原理
JVM解释字节码,就得经过加载、连接以及初始化三个过程,通过这三个过程创建了一个类型,且被Java程序所使用。
2.1 加载
就是要通过寻找类或者是接口字节码文件,从而来进行解析并且构造出JVM内部对象所表示的组件。
2.2 连接
即是将加载过的二进制数据进行合并,进入到JVM中,其中包括有检查、准备以及解析三个阶段。
2.3 初始化
也就是对静态的变量、静态代码块进行初始化工作。
也就是说,JVM在运行时会产生几个类加载器,而当类加载器要运行时,Java对类加载器进行了分工以及分级,以方便多个类加载器的协调工作。而且同一级别的类加载器负责相应级别的类。JVM采用的是“全盘负责双亲委托模型”的类加载器机制,“全盘负责”指的是一个加载器装载一个雷=类,该类依靠和引用的类也是从这个加载器载入。“委托模型”则是说加载器加载某个类时,会先在加载器中检测需要加载的类有没有加载,加载了便直接返回到先前加载过的类对象,反之,这个类没有被加载过,就把其类名上交给父类加载器,让父类加载器去加载,如果父类加载器可以加载,就返回对应的class对象,不然就还是得继续向上提交到根引导类加载器,这就是一个递归的过程。从安全性方面考虑,只有在根引导器都无法加载了,才从自己的类路径里查询装载目标类,这样的话,就算是有人写了恶性的基础类,并将其加载到了JVM中,但是一旦有了委托模型,就永远是根加载转载基础类,也就能够抵制恶劣后果的出现了。
3 Java动态类加载的实现
JVM加载类的方式主要分为隐形加载和显式加载。隐式加载是指程序在运行时用new等的方式生成对象然后加载到对应的JVM里,显式装载是程序员把需要的类加载器加载到内存当中。有两种方法,分别是Class.forName以及java.lang.ClassLoader,其显式加载很大程度上提高了程序的灵活性。任何类的加载都是经由抽象类、ClassLoader类和其子类实现,是属于Java核心API的一部分,所有的自定义类加,载器必须得继承以及实例化该类,其主要途径有:
3.1 Class loadClass
用委托机制来加载该类,检查此类加载器中要加载的项目是不是已经加载过,是的话就返回到先抢加载过该类的对象,若是没有被加载,就让父类加载器加载,最后调用finaClass的方法查找该类。
3.2 Class findClass
可通过制定的二进制查找该类,用父类加载器检查好所有请求的类以后,这个方法会被loadClass所调回,loadClass的缺省实现调用此方法,且能够对其覆盖定制。
3.3 Class defineClass
此种方法主要是把字节数组转化成类的字节码。
3.4 Class findSystem
用系统类的加载器加载该类文件,若有,为将该文件装换成类,可以把其原始的字节转换为Class对象。
3.5 Class findLoadedClass
若是Java虚拟机已经把这个加载器记录成二进制名称的某个类加载器,就返回此二进制名称的类。
4 Java动态类加载的运用
Java的动态类加载器能够对已经完整的程序进行改造,其加载功能相当强大,能够通过控制类的加载过程,从而丰富程序功能,比如常用到的网络页面,建立了一个手机网站,后台的分工十分细化。首先分配控制栏目以及公共功能,然后建立差异化和可拔插模块,将静态页面动起来,以动态化的方式满足不同人的需求。灵活性调整模块的功能,让系统更加灵活且最大化的扩展系统。同时这种动态的加载既在一定程度上降低了网页受到恶性攻击的风险,也提升了系统的稳定性与流畅性,让用户得到更好更深层次的体验。
综上所述,Java动态类加载毫无疑问是Java程序中具有动态性的关键机制,同时也是JVM的一项核心技术,在程序设计领域中动态加载机制占据着重要的位置,它可以自定义的加载策略以及实现动态名字的空间,具有非常大的灵活性。深入学习Java动态类加载机制可以有效提高Java程序的质量以及效率,本文主要对Java动态类加载机制做了一个简要分析和探讨,但是Java动态类加载的重点和运用绝对不仅限于这些,还有很多我们发现或者没发现的作用和机理,这些都还有待日后的进一步探讨。
参考文献
[1]王万森,龚文.Java动态类加载机制研究及应用[J].计算机工程与设计,2011,06:2154-2158.
[2]崔行臣,赵佟.Java动态类加载机制分析及其应用[J].计算机系统应用,2013,07:187-191.
[3]肖银莹,陈瑛,陈超.Java动态类加载机制研究及应用[J].电子技术与软件工程,2015,21:252.
作者简介
朱丹丹(1969-),女,湖北省荆州市人。大学本科学历。现为仙桃职业学院讲师。研究方向为Java、Android应用开发。
作者单位
仙桃职业学院 湖北省仙桃市 433000