【 某網(wǎng)友討論道: 】
: RT,反射的特性發(fā)現(xiàn)很少用啊
恰恰相反,有些反射的特性是經(jīng)常會被使用到的。
反射總體上分成兩大特性,一是自省,二是發(fā)射;
自省的能力極為重要,而且?guī)缀鯐焯煊玫剑苌僖姷竭^哪個.net應用中不使用attribute的,而attribute特性就是metadata通過在自省能力支撐下實現(xiàn)的;當然自省不單單是attribute特性的運用,只要是在運行時動態(tài)檢視程序自身的特性都要由反射的自省能力來支持,比如Visual Studio的IDE(這個集成開發(fā)環(huán)境本身就是.net應用的好案例)對于.net組件的自動探測功能;同時,自省的能力也是基于虛擬機平臺的語言,比如c#和java,區(qū)別于傳統(tǒng)語言比如c和c++的重要特性之一,這提供了程序設(shè)計開發(fā)更為便利和安全的運行時環(huán)境;相對而言,在c++(當然是native而不是managed)的環(huán)境下,除了RTTI極為單薄的運行時自省,也就是QT這個庫通過meta-object system部分模擬了自省的特性;
反射的另外一個重要特性就是發(fā)射,它讓“程序可以寫程序”了,簡要的說就是在運行時動態(tài)生成MSIL并加載運行以及持久化動態(tài)生成的MSIL的能力;由這個特性的支持,讓原先一些程序設(shè)計和開發(fā)領(lǐng)域相對困難和繁瑣的工作,比如元編程meta programming,比如動態(tài)代理dynamic proxy,比如AOP中的基礎(chǔ)設(shè)施weaver的實現(xiàn),變得可能或相對易于實現(xiàn);反射的特性,也是基于虛擬機平臺CLR的支持,以metadata為基礎(chǔ)來實現(xiàn)的,所以這也是虛擬機平臺語言的特有優(yōu)勢,而在傳統(tǒng)語言平臺上,這是難以實現(xiàn)的;比如關(guān)于meta programming,c++就是通過模板特性實現(xiàn)的編譯期meta programming,這與虛擬機平臺上實現(xiàn)的運行時meta programming還是有比較大的差距(比如前者如何保證生成的代碼的type-safe);
以上這兩個特性,自省和發(fā)射,都有個共同點,他們都是圍繞著metadata機制,并在虛擬機平臺運行時環(huán)境CLR支持下實現(xiàn)的,前者是運行時檢視相關(guān)的metadata,后者是運行時動態(tài)生成相關(guān)的metadata和MSIL;從這點也就可以看出,要想深入理解這些特性,就需要研究metadata和MSIL的實現(xiàn),以及虛擬機運行時環(huán)境的實現(xiàn)(在java平臺上,就是bytecode和JVM);
所以,反射,可能是虛擬機平臺所提供的相對最為強勁,最為復雜,和平臺運行時本身關(guān)系最密切,也是區(qū)別于傳統(tǒng)語言和運行時最鮮明的特性。