一、反射的概念
反射和自省,做為靜態(tài)和動態(tài)時的處理的方式,導(dǎo)致的操作手段不盡相同。那么對c++來說,如何能夠獲取數(shù)據(jù)類型,在發(fā)展到今天,已經(jīng)不是一個選擇題,而是一個必選題。語言要想生存下去,就需要不斷的創(chuàng)新和發(fā)展,不斷的完善和迭代自己,那么做為高級語言中常見的反射,c++也在通過各種手段,在悄悄的補上這一課。直到最后c++標(biāo)準(zhǔn)的引入。
什么是反射(Reflection)?就是反映程序在動態(tài)運行時,檢測、查尋和修改自身狀態(tài)或者行為的一種能力。一般來說,通過反射可以獲得:
1、指定對象的類型
2、獲得相關(guān)對象的所有的成員變量和方法(對私有和保護不同的語言可能處理方式略有不同)。
3、動態(tài)創(chuàng)建對象。
4、在動態(tài)運行時調(diào)用相關(guān)對象的方法和函數(shù)及相關(guān)屬性。
反射使語言的操作推進到了運行狀態(tài),但這不代表反射更加優(yōu)秀,他也有不少的缺點:
1、性能,反射的過程導(dǎo)致整個運行時的動作會耗費更多的運行時間。
2、降低了可維護性。因為對運行狀態(tài)期的理解不同,導(dǎo)致可能維護者對代碼的理解不同。
3、反射使整體的業(yè)務(wù)邏輯變得復(fù)雜。
正所謂因人施教,因材施教,用得恰到好處,才是真得優(yōu)秀的編程者。
二、反射的類別和應(yīng)用場景
反射一般分為動態(tài)反射和靜態(tài)反射兩大類。當(dāng)然在不同的語言中對反射的理解和處理都有些許的不同,需要注意。一般來說,動態(tài)語言如Python、c#等處理反射就非常容易,但對于靜態(tài)語言如C,c++等這種過渡性高級語言,其實處理反射就比較麻煩。但是也不能說靜態(tài)語言不能處理反射,比如c++可以通過宏或者SFINAE等技術(shù)做一些基本的反射動作。
這里要區(qū)分動態(tài)反射-靜態(tài)反射和動態(tài)語言-動態(tài)語言的不同。動態(tài)反射多是指在運行期,靜態(tài)反射多指在編譯期,所以它也叫自省。而動態(tài)語言和靜態(tài)語言則是指是否在運行期進行數(shù)據(jù)類型檢查的不同。
反射的主要應(yīng)用場景如下:
1、序列化和反序列化:這是最常用的場景。如果沒有反射,那可麻煩大了。手動自己一個個匹配字節(jié)碼吧。
2、遠程方法RMI的調(diào)用,這個有過c#和Java開發(fā)經(jīng)驗的會非常容易理解。
3、數(shù)據(jù)庫開發(fā)用的O/R Mapping,即對象關(guān)系映射。
4、設(shè)計模式中的一些應(yīng)用,如工廠模式等。
5、其它,只要涉及到反射可以得到的類型處理等的情況。
在實現(xiàn)反射的手段中,一般有兩種形式,即侵入式和非侵入式,這個通過名字就可以知道哪種效果會更優(yōu)。
三、c++中的反射
從某種角度來說,c++是不支持反射的。當(dāng)然,如果嚴格來說,c++是不支持動態(tài)反射的,但是通過一些技術(shù)手段可以實現(xiàn)靜態(tài)反射的效果。這就包括前面學(xué)習(xí)到的元編程、模板編程(SFINAE)還有宏機制等。但是需要說明的,如果在業(yè)務(wù)邏輯上通過某種技巧實現(xiàn)類似反射的結(jié)果,一般來說,這不能歸到反射上去。當(dāng)然,這個就仁者見仁了。
在早期的c++中,最典型的其實就是MFC中通過模板和宏來生動態(tài)生成類并生成類的對象,這其實就是一種反射的應(yīng)用。而在新的c++20提供了屬性,這其實就是一個進步,它其實就可以說對反射的一種支持。c++這種靜態(tài)語言會不會推出從標(biāo)準(zhǔn)上支持的反射,這個還不敢給出確切的說法(但有可能在c++26或29中支持)。
也就是說,當(dāng)前的c++標(biāo)準(zhǔn)只是在RTTI(運行期類型識別)僅僅是一個類型的判斷處理,簡單到了發(fā)指。雖然c++20(reflexpr關(guān)鍵字)提供了一些面向未來測試的實現(xiàn)方式,但目前來看,也僅僅是一個結(jié)探索,并未真正實現(xiàn),必須類似的老套的劇情發(fā)生過很多次,不斷的更新迭代版本,甚至廢棄都有可能。文章來源:http://www.zghlxwxcb.cn/news/detail-431945.html
四、總結(jié)
其實反射也可以放到模板元編程中來進行分析,但是為了更好的講解一些c++的高級特性,還是把它分離了出來。c++的許多高級的特性,在國內(nèi)的大多數(shù)應(yīng)用場景上,其實是應(yīng)用不到的。原因是,這些高級特性大多是在基礎(chǔ)庫支持或者基礎(chǔ)軟件上才用的。而這恰恰是國內(nèi)的軟肋。
知已知彼,百戰(zhàn)不殆??吹接惺裁床蛔悖拍芨玫难a齊它。共同努力!文章來源地址http://www.zghlxwxcb.cn/news/detail-431945.html
到了這里,關(guān)于跟我學(xué)c++高級篇——反射的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!