Java动态类加载机制应用研究

2018-09-13 10:47孙彬
科技创新与应用 2018年23期
关键词:结构体系

孙彬

摘 要:在Java应用程序运行时,Java虚拟机中的类加载机制能在不影响其他功能模块运行的情况下动态加载类文件。文章简述了Java类加载器的层次体系结构以及动态加载机制原理,并结合具体的例子,将Java动态加载机制应用在高校网站管理平台的文件发布模块,实现了系统和静态网页的关联,可快速搭建二级网站,还能通过自定义加载器能对加密的字节码进行解密,得出了Java语言具有强大的灵活性和安全度,能很好的保护代码安全。

关键词:Java;动态类加载机制;结构体系

中图分类号:TP312 文献标志码:A 文章编号:2095-2945(2018)23-0180-02

Abstract: The class-loading mechanism in the Java Virtual Machine can dynamically load class files without affecting the running of other functional modules while the Java application is running. In this paper, the hierarchical structure of Java classloader and the principle of dynamic loading mechanism are briefly described. Based on specific examples, Java dynamic loading mechanism is applied to file publishing module of university website management platform. The association between the system and the static web page is realized, the secondary web site can be built quickly, and the encrypted bytecode can be decrypted by the custom loader. It is concluded that the Java language has strong flexibility and security, and can protect the code security very well.

Keywords: Java; dynamic classloading mechanism; architecture system

动态加载能在运行时安装程序组件,Microsoft Windows等系统中都有用到动态加载技术。动态连接比静态连接更有灵活性,并且能节约一定的内存空间。Java动态类加载是调用所用的类,这些类并未在源代码中提到,单个程序是由多个类组成的。一个程序启动时总是先加载一些基础类到JVM,剩余的类是在需要时再另行加载的。这种加载方式能在很大程度上实现对内存的节约,体现Java语言加载的动态性。Java体系结构语言包括了Java语言、Java虚拟机4大部分、Java class文件和Java API,其中JVM是Java体系结构的核心部分[1]。Java动态类加载先将程序运行的基础类加载到JVM中,等JVM用到时再加载其他类。

1 Java类加载器的结构体系

Java中的类需被装载到JVM中实现运行,JVM中的有类加载器,负责完成对Java类的装载。类加载器从硬盘中读取类文件到内存里。Java中的类的形式多种多样,根据功能和加载方式的不同,基本上可分为核心类、扩展类还要许多用户根据自身需求自定义的类。对应不同Java中的类。JVM里面的类加载器也分为三种,它们分别是Bootstrap ClassLoader,负责对Java中核心类的加载;ExtClassLoader,负责对拓展类的加载;AppClassLoader,负责对用户自定义类的加载。JVM程序内存在较为灵活的类装载器组件,在单个应用程序中能允许多个类加载器同时允许,进行对类加载方式的自定义操作。Bootstrap ClassLoader加载器是用编写虚拟机的语言编写的,在系统中是唯一的。如若JVM使用C语言或C++语言在操作环境下完成运行目标,那么Bootstrap ClassLoader看做这两种语言体系下实现部分,也是用C语言或者C++语言进行表示。Bootstrap ClassLoader加载Java运行环境提供程序运行的核心类,这些类有着重要的作用,要实现实现加载。Bootstrap ClassLoader在运行中,不仅要完成对核心类的加载,而且还要完成对Ext ClassLoader以及App ClassLoader的加载,它们是兩个用户类加载器,作用是加载核心类之外的类。这两个类加载器的本质其实也属于类,也需要被加载,Bootstrap ClassLoade本身不属于Java类。在分工方面,Ext ClassLoader负责加载jre/lib/ext中的所有类;App ClassLoader负责加载classpath指定路径中程序所需的类[2]。JVM中的类加载器间的结构采用树形结构,具有父子关系。App ClassLoader的父加载器是Ext ClassLoader,而Ext ClassLoader的父加载器是Bootstrap ClassLoade。JVM中的加载器不只三个,实际应用中,一些类不能被以上三个加载器加载,用户这时候要根据自身的实际需求进行加载器的编写,以达到相应的加载目的。

2 Java动态类加载机制原理

JVM在运行过程中,产生的类加载器数量最少是三个,通常是Ext ClassLoader、Bootstrap ClassLoader以及APP ClassLoader,为了将多个类加载器能互相配合工作,就需要根据它们的功能分类并划分级别,级别不同,加载的类也不一样,此时引入了一个Parent概念,就是我们通常所说的“双亲”。JVM根据这种层次关系完成一系列加载工作,实现按需加载。在对类进行加载时,首先会对父类加载器发出请示,如果父类加载器搜索路径加载不到,自己类加载器才进行搜索,呈现递归性。这种递归作用大大的增强了加载的安全性,防止一些恶意类带来的破坏。同一个类能在不同加载器间实现多次加载,同一加载器的加载次数只有一次。加载器在完成对类的加载前会对类进行检测,判定是否被加载过。每个类由名字和类加载器两个参数组成。抽象类ClassLoader是由Java核心类库提供的,在相关的制约下,所有的自定义类加载器必须对获取的类对象实施继承性和实例化转型操作,自定义类加载器须对类对象进行继承性操作,自定义加载器对其他加载器有一定的依赖度,会对JVM技术体系中Bootstrap ClassLoader发出请求。一个类加载器请求另一个类加载器的过程若能实现形式化建制,也就意味着实现了对“双亲委托”模型的构建。除了启动类加载器,技术运行体系中,其他所有的类加载器只有一个“双亲”。若“双亲”没实现清晰制定,可根据运行状况分配默认状态下的技术区位[3]。

3 Java动态类加载的实现

JVM要通过加载、连接和初始化三步解释字节码,加载是.class格式文件进行读入,创建class对象;连接是把已加载数据合并到虚拟机运行中;初始化是将类变量赋以初始值[4]。Java中是动态加载,通过“双亲”机制完成。Java动态类加载分为显式加载和隐式加载,显式加载方式分为Class.forName()方法,第二种是LoadClass()提供,显式加载相比于隐式加载,灵活度得到了提升。自定义的加载器从Java.Lang.ClassLoader的任何子类创建,需指定一个父加载器。任何类加载通过ClassLoader类或者子类实现,是Java核心API中的一部分,自定义类加载器须继承并实例化该类,采取Class LoadClass、Class findClass、Class defineClass、Class findSystemClass和Class findLoadedClass等重要方法[5]。动态类加载使用Java.Lang.Class的forName()方法,有两种重载形式:

Public static Class forName(Sting className)throws ClassNotFoundException

Public static Class forName(string name,boolean initialize,ClassLoader Loader)

使用第三参数指定类加载器,与类关连的Class对象,第二个参数指定表示是否被初始化。

Class.forName(“FOO”,true,this.getClass).getClassLoader

根据用户的需要,在实现动态类加载时,使用forName()方法或是自定义类加载器。forName()方法使用频率较高,最为直接,使用forName()方法实现请求类型在加载时初始化。自定义类加载功能是实现从数据库中获取或者进行动态创建,用定制方式转换类型的全限定名转为Java class文件格式字节数组,从而进行安全防护。

4 应用例子

Java类加载器有着非常强大的功能,通过将类进行重载的方式达到程序加载功能实现。Java类加载器在生活中有着广泛的应用,这里将Java动态类加载机制应用在二级网站管理系统的文件发布模块,加载被加密的Java类文件。在系统需求方面,需搭建网站通用平台实现对二级网站的统一管理。通过管理平台搭建完毕后,若想建设二级网站,只需做好静态网页,在平台中分配栏目,个性化功能需文件发布模块,发布到通用平台中。文件发布模块能实现对二级网站静态页面的动态化,使得静态网页和系统关联,增加系统拓展性,降低模块间的耦合性,对文件代码作出加密处理,保障了系统的安全。

综上所述,Java动态类加载是Java程序中的重要機制,文章阐述了Java类加载器的技术结构体系,阐明了动态加载机制的原理,看出了Java动态加载机制技术性严密,为技术人员提供了参考。文章最后结合具体的例子将这样技术用在高校网站通用管理平台的文件发布模块,实现了二级网站建设的拓展,为系统增加了拓展性。已经加密的代码只能通过自定义加载器解密,保证了文件的安全性。

参考文献:

[1]黄军.Java动态类加载机制研究及应用[J].信息与电脑(理论版),2018(04):3-4.

[2]朱丹丹.刍议Java动态类加载机制研究与应用[J].电子技术与软件工程,2016(07):245.

[3]王智恒.基于动态加载技术的Android插件化开发框架研究与实现[D].云南大学,2016.

[4]邹煜.Java类文件混合加密算法的研究与分析[D].华中师范大学,2017.

[5]崔娜.Java动态类加载机制研究及运用[J].信息与电脑(理论版),2015(24):15-16.

[6]籍慧文.Web应用开发中JAVA编程语言的应用探讨[J].科技创新与应用,2017(07):90.

[7]贺蕴彬.Java虚拟机的自适应动态优化[J].科技创新与应用,

2014(13):70.

猜你喜欢
结构体系
试论物理学的“知识的结构体系”
有关嵌入式微处理器的自行高炮火控监测系统的研究
大型混凝土施工模板结构体系控制技术研究
不同结构体系高层建筑的综合经济效益研究