什么是反射機(jī)制反射機(jī)制的安全性
什么是反射機(jī)制反射機(jī)制的安全性
反射機(jī)制主要是指程序可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。那么你對(duì)反射機(jī)制了解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是反射機(jī)制的內(nèi)容,希望大家喜歡!
反射機(jī)制的概念
在計(jì)算機(jī)科學(xué)領(lǐng)域,反射是指一類(lèi)應(yīng)用,它們能夠自描述和自控制。也就是說(shuō),這類(lèi)應(yīng)用通過(guò)采用某種機(jī)制來(lái)實(shí)現(xiàn)對(duì)自己行為的描述(self-representation)和監(jiān)測(cè)(examination),并能根據(jù)自身行為的狀態(tài)和結(jié)果,調(diào)整或修改應(yīng)用所描述行為的狀態(tài)和相關(guān)的語(yǔ)義。
反射機(jī)制也被應(yīng)用到了視窗系統(tǒng)、操作系統(tǒng)和文件系統(tǒng)中。 反射本身并不是一個(gè)新概念,它可能會(huì)使我們聯(lián)想到光學(xué)中的反射概念,盡管計(jì)算機(jī)科學(xué)賦予了反射概念新的含義,但是,從現(xiàn)象上來(lái)說(shuō),它們確實(shí)有某些相通之處,這些有助于我們的理解。同一般的反射概念相比,計(jì)算機(jī)科學(xué)領(lǐng)域的反射不單單指反射本身,還包括對(duì)反射結(jié)果所采取的措施。所有采用反射機(jī)制的系統(tǒng)(即反射系統(tǒng))都希望使系統(tǒng)的實(shí)現(xiàn)更開(kāi)放??梢哉f(shuō),實(shí)現(xiàn)了反射機(jī)制的系統(tǒng)都具有開(kāi)放性,但具有開(kāi)放性的系統(tǒng)并不一定采用了反射機(jī)制,開(kāi)放性是反射系統(tǒng)的必要條件。一般來(lái)說(shuō),反射系統(tǒng)除了滿足開(kāi)放性條件外還必須滿足原因連接(Causally-connected)。所謂原因連接是指對(duì)反射系統(tǒng)自描述的改變能夠立即反映到系統(tǒng)底層的實(shí)際狀態(tài)和行為上的情況,反之亦然。開(kāi)放性和原因連接是反射系統(tǒng)的兩大基本要素。
Java中,反射是一種強(qiáng)大的工具。它使您能夠創(chuàng)建靈活的代碼,這些代碼可以在運(yùn)行時(shí)裝配,無(wú)需在組件之間進(jìn)行源代表鏈接。反射允許我們?cè)诰帉?xiě)與執(zhí)行時(shí),使我們的程序代碼能夠接入裝載到JVM中的類(lèi)的內(nèi)部信息,而不是源代碼中選定的類(lèi)協(xié)作的代碼。這使反射成為構(gòu)建靈活的應(yīng)用的主要工具。但需注意的是:如果使用不當(dāng),反射的成本很高。
反射機(jī)制的安全性
在處理反射時(shí)安全性是一個(gè)較復(fù)雜的問(wèn)題。反射經(jīng)常由框架型代碼使用,由于這一點(diǎn),我們可能希望框架能夠全面接入代碼,無(wú)需考慮常規(guī)的接入限制。但是,在其它情況下,不受控制的接入會(huì)帶來(lái)嚴(yán)重的安全性風(fēng)險(xiǎn),例如當(dāng)代碼在不值得信任的代碼共享的環(huán)境中運(yùn)行時(shí)。
由于這些互相矛盾的需求,Java編程語(yǔ)言定義一種多級(jí)別方法來(lái)處理反射的安全性。基本模式是對(duì)反射實(shí)施與應(yīng)用于源代碼接入相同的限制:
n 從任意位置到類(lèi)公共組件的接入
n 類(lèi)自身外部無(wú)任何到私有組件的接入
n 受保護(hù)和打包(缺省接入)組件的有限接入
不過(guò)至少有些時(shí)候,圍繞這些限制還有一種簡(jiǎn)單的方法。我們可以在我們所寫(xiě)的類(lèi)中,擴(kuò)展一個(gè)普通的基本類(lèi)java.lang.reflect.AccessibleObject 類(lèi)。這個(gè)類(lèi)定義了一種setAccessible方法,使我們能夠啟動(dòng)或關(guān)閉對(duì)這些類(lèi)中其中一個(gè)類(lèi)的實(shí)例的接入檢測(cè)。唯一的問(wèn)題在于如果使用了安全性管理器,它將檢測(cè)正在關(guān)閉接入檢測(cè)的代碼是否許可了這樣做。如果未許可,安全性管理器拋出一個(gè)例外。
下面是一段程序,在TwoString 類(lèi)的一個(gè)實(shí)例上使用反射來(lái)顯示安全性正在運(yùn)行:
public class ReflectSecurity {
public static void main(String[] args) {
try {
TwoString ts = new TwoString("a", "b");
Field field = clas.getDeclaredField("m_s1");
//field.setAccessible(true);
System.out.println("Retrieved value is " +field.get(inst));
} catch (Exception ex) {
ex.printStackTrace(System.out);
} } }
如果我們編譯這一程序時(shí),不使用任何特定參數(shù)直接從命令行運(yùn)行,它將在field .get(inst)調(diào)用中拋出一個(gè)IllegalAccessException異常。如果我們不注釋field.setAccessible(true)代碼行,那么重新編譯并重新運(yùn)行該代碼,它將編譯成功。最后,如果我們?cè)诿钚刑砑恿薐VM參數(shù)-Djava.security.manager以實(shí)現(xiàn)安全性管理器,它仍然將不能通過(guò)編譯,除非我們定義了ReflectSecurity類(lèi)的許可權(quán)限。
看過(guò)“反射機(jī)制的安全性”的人還看了:
2.社會(huì)拒絕的生理反應(yīng)及理論解釋探討論文
3.早泄病的原因