目前計算機的運行可以說已經(jīng)離不開Java編程體系,Java是指一種能夠撰寫跨平臺的應用軟件的面向其對象的程序設計語言。JVM(虛擬機)是Java編程體系的核心,而Java的動態(tài)類加載則是JVM的重要特征之一。本文就Java的動態(tài)類加載機制的研究與應用,淺要分析了Java的動態(tài)類加載器的原理與層次體系結(jié)構(gòu),以作參考。
【關鍵詞】Java虛擬機 動態(tài)類加載機制 體系結(jié)構(gòu) 研究應用
1 Java類加載的層次體系結(jié)構(gòu)
Java中的所有類都是經(jīng)由裝載到jvm中的類加載器加載完成的,類加載器就是把類文件從硬盤讀取到內(nèi)存中。Java中的類可分為Java系統(tǒng)核心類。擴展類以及由程序員自定義的類;jvm的加載器也分為Bootstrap,classLoader,ExtClassLoader以及AppClassLoader,其分別對應的是加載Java的系統(tǒng)核心、擴展以及程序員自定義的應用類。另外,除了jvm默認的三個加載器,第三方如果有特殊的需求,也可以自己編寫類加載器。就比如,如果需要加密指定目錄的類,就只能用我們自己類的加載器才能解密加載。
2 Java動態(tài)類加載機制的原理
JVM解釋字節(jié)碼,就得經(jīng)過加載、連接以及初始化三個過程,通過這三個過程創(chuàng)建了一個類型,且被Java程序所使用。
2.1 加載
就是要通過尋找類或者是接口字節(jié)碼文件,從而來進行解析并且構(gòu)造出JVM內(nèi)部對象所表示的組件。
2.2 連接
即是將加載過的二進制數(shù)據(jù)進行合并,進入到JVM中,其中包括有檢查、準備以及解析三個階段。
2.3 初始化
也就是對靜態(tài)的變量、靜態(tài)代碼塊進行初始化工作。
也就是說,JVM在運行時會產(chǎn)生幾個類加載器,而當類加載器要運行時,Java對類加載器進行了分工以及分級,以方便多個類加載器的協(xié)調(diào)工作。而且同一級別的類加載器負責相應級別的類。JVM采用的是“全盤負責雙親委托模型”的類加載器機制,“全盤負責”指的是一個加載器裝載一個雷=類,該類依靠和引用的類也是從這個加載器載入?!拔心P汀眲t是說加載器加載某個類時,會先在加載器中檢測需要加載的類有沒有加載,加載了便直接返回到先前加載過的類對象,反之,這個類沒有被加載過,就把其類名上交給父類加載器,讓父類加載器去加載,如果父類加載器可以加載,就返回對應的class對象,不然就還是得繼續(xù)向上提交到根引導類加載器,這就是一個遞歸的過程。從安全性方面考慮,只有在根引導器都無法加載了,才從自己的類路徑里查詢裝載目標類,這樣的話,就算是有人寫了惡性的基礎類,并將其加載到了JVM中,但是一旦有了委托模型,就永遠是根加載轉(zhuǎn)載基礎類,也就能夠抵制惡劣后果的出現(xiàn)了。
3 Java動態(tài)類加載的實現(xiàn)
JVM加載類的方式主要分為隱形加載和顯式加載。隱式加載是指程序在運行時用new等的方式生成對象然后加載到對應的JVM里,顯式裝載是程序員把需要的類加載器加載到內(nèi)存當中。有兩種方法,分別是Class.forName以及java.lang.ClassLoader,其顯式加載很大程度上提高了程序的靈活性。任何類的加載都是經(jīng)由抽象類、ClassLoader類和其子類實現(xiàn),是屬于Java核心API的一部分,所有的自定義類加,載器必須得繼承以及實例化該類,其主要途徑有:
3.1 Class loadClass
用委托機制來加載該類,檢查此類加載器中要加載的項目是不是已經(jīng)加載過,是的話就返回到先搶加載過該類的對象,若是沒有被加載,就讓父類加載器加載,最后調(diào)用finaClass的方法查找該類。
3.2 Class findClass
可通過制定的二進制查找該類,用父類加載器檢查好所有請求的類以后,這個方法會被loadClass所調(diào)回,loadClass的缺省實現(xiàn)調(diào)用此方法,且能夠?qū)ζ涓采w定制。
3.3 Class defineClass
此種方法主要是把字節(jié)數(shù)組轉(zhuǎn)化成類的字節(jié)碼。
3.4 Class findSystem
用系統(tǒng)類的加載器加載該類文件,若有,為將該文件裝換成類,可以把其原始的字節(jié)轉(zhuǎn)換為Class對象。
3.5 Class findLoadedClass
若是Java虛擬機已經(jīng)把這個加載器記錄成二進制名稱的某個類加載器,就返回此二進制名稱的類。
4 Java動態(tài)類加載的運用
Java的動態(tài)類加載器能夠?qū)σ呀?jīng)完整的程序進行改造,其加載功能相當強大,能夠通過控制類的加載過程,從而豐富程序功能,比如常用到的網(wǎng)絡頁面,建立了一個手機網(wǎng)站,后臺的分工十分細化。首先分配控制欄目以及公共功能,然后建立差異化和可拔插模塊,將靜態(tài)頁面動起來,以動態(tài)化的方式滿足不同人的需求。靈活性調(diào)整模塊的功能,讓系統(tǒng)更加靈活且最大化的擴展系統(tǒng)。同時這種動態(tài)的加載既在一定程度上降低了網(wǎng)頁受到惡性攻擊的風險,也提升了系統(tǒng)的穩(wěn)定性與流暢性,讓用戶得到更好更深層次的體驗。
綜上所述,Java動態(tài)類加載毫無疑問是Java程序中具有動態(tài)性的關鍵機制,同時也是JVM的一項核心技術(shù),在程序設計領域中動態(tài)加載機制占據(jù)著重要的位置,它可以自定義的加載策略以及實現(xiàn)動態(tài)名字的空間,具有非常大的靈活性。深入學習Java動態(tài)類加載機制可以有效提高Java程序的質(zhì)量以及效率,本文主要對Java動態(tài)類加載機制做了一個簡要分析和探討,但是Java動態(tài)類加載的重點和運用絕對不僅限于這些,還有很多我們發(fā)現(xiàn)或者沒發(fā)現(xiàn)的作用和機理,這些都還有待日后的進一步探討。
參考文獻
[1]王萬森,龔文.Java動態(tài)類加載機制研究及應用[J].計算機工程與設計,2011,06:2154-2158.
[2]崔行臣,趙佟.Java動態(tài)類加載機制分析及其應用[J].計算機系統(tǒng)應用,2013,07:187-191.
[3]肖銀瑩,陳瑛,陳超.Java動態(tài)類加載機制研究及應用[J].電子技術(shù)與軟件工程,2015,21:252.
作者簡介
朱丹丹(1969-),女,湖北省荊州市人。大學本科學歷?,F(xiàn)為仙桃職業(yè)學院講師。研究方向為Java、Android應用開發(fā)。
作者單位
仙桃職業(yè)學院 湖北省仙桃市 433000