目前計算機的運行可以說已經離不開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