通州北大青鳥(niǎo)學(xué)校詳解Java裝載器(下)

在前一篇文章中,北大青鳥(niǎo)北京通州校區(qū)技術(shù)老師介紹了類(lèi)裝載器的知識(shí),例如:每一個(gè)類(lèi)被裝載的時(shí)候,Java虛擬機(jī)都監(jiān)視這個(gè)類(lèi),看到它到底是被啟動(dòng)類(lèi)裝載器還是被用戶(hù)定義類(lèi)裝載器裝載。當(dāng)被裝載的類(lèi)引用了另外一個(gè)類(lèi)時(shí),虛擬機(jī)就會(huì)使用裝載第一個(gè)類(lèi)的類(lèi)裝載器裝載引用的類(lèi)。

正是由于Java虛擬機(jī)采取這種方式進(jìn)行類(lèi)的裝載,所以被裝載的類(lèi)默認(rèn)情況下只能看到被同一個(gè)類(lèi)裝載器裝載的別的類(lèi)。通過(guò)這種方法,Java的體系結(jié)構(gòu)允許在一個(gè)Java應(yīng)用程序中建立多個(gè)命名空間。運(yùn)行時(shí)的Java程序中的每一個(gè)類(lèi)裝載器都有自己的命名空間。

北大青鳥(niǎo)北京通州校區(qū)技術(shù)老師介紹,Java應(yīng)用程序可以創(chuàng)建多少個(gè)(或多少種)被不同的類(lèi)裝載器裝載的類(lèi)存放在不同的命名空間中,它們不能相互訪(fǎng)問(wèn),除非應(yīng)用程序顯示地允許這么做。當(dāng)編寫(xiě)一個(gè)Java應(yīng)用程序的時(shí)候,從不同源文件裝載的類(lèi)可以分隔在不同的命名空間中。通過(guò)這種方法,就能夠使用Java類(lèi)裝載器的體系結(jié)構(gòu)來(lái)控制任何不同源文件中裝載的代碼之間的相互影響,特別是能夠阻止惡意代碼獲取訪(fǎng)問(wèn)或破壞善意代碼的權(quán)限。

Web瀏覽器是一個(gè)動(dòng)態(tài)擴(kuò)展的例子,Web瀏覽器使用用戶(hù)定義的類(lèi)裝載器從網(wǎng)絡(luò)下載用于Java applet的class文件。Web瀏覽器使用一個(gè)用來(lái)安裝用戶(hù)定義類(lèi)裝載器的Java應(yīng)用程序。這個(gè)用戶(hù)定義的類(lèi)裝載器通常被稱(chēng)為Java Applet類(lèi)裝載器,它知道如何向HTTP服務(wù)器請(qǐng)求class文件。Java Applet可以作為動(dòng)態(tài)擴(kuò)展的例子,因?yàn)镴ava應(yīng)用程序并不知道它什么時(shí)候會(huì)開(kāi)始從網(wǎng)絡(luò)下載瀏覽器請(qǐng)求的class文件。只有當(dāng)瀏覽器遇到有Java applet的頁(yè)面時(shí),才決定是否需要下載class文件。

Web瀏覽器啟動(dòng)的Java應(yīng)用程序通常為每個(gè)提供class文件的網(wǎng)絡(luò)地址分別創(chuàng)建不同的用戶(hù)定義類(lèi)裝載器,因此,不同的用戶(hù)定義類(lèi)裝載器裝載不同來(lái)源的class文件。這就可以把它們分別放置在Java主機(jī)應(yīng)用程序的不同命名空間之下。由于不同來(lái)源的Java applet文件放置在不同的命名空間中,惡意的Java applet代碼就不會(huì)直接訪(fǎng)問(wèn)從別的地方下載的class文件。這就能夠限制或阻止不同來(lái)源的代碼之間的相互訪(fǎng)問(wèn)。北大青鳥(niǎo)北京通州校區(qū)學(xué)術(shù)部提供。

 

北大青鳥(niǎo)網(wǎng)上報(bào)名
北大青鳥(niǎo)招生簡(jiǎn)章