delphi rtti機制淺探

delphi rtti機制淺探

ID:8145546

大小:123.50 KB

頁數(shù):25頁

時間:2018-03-07

delphi rtti機制淺探_第1頁
delphi rtti機制淺探_第2頁
delphi rtti機制淺探_第3頁
delphi rtti機制淺探_第4頁
delphi rtti機制淺探_第5頁
資源描述:

《delphi rtti機制淺探》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、Delphi的RTTI機制淺探savetime2k@yahoo.com?2004.1.20http://savetime.delphibbs.com目錄⊙RTTI簡介⊙類(class)和VMT的關(guān)系⊙類(class)、類的類(classofclass)、類變量(classvariable)的關(guān)系⊙TObject.ClassType和TObject.ClassInfo⊙is和as運算符的原理⊙TTypeInfo–RTTI信息的結(jié)構(gòu)⊙獲取類(class)的屬性(property)信息⊙獲取方法(method)的類型信息⊙獲取有序類型(ordinal)、集合(set)類型的RTTI信

2、息⊙獲取其它數(shù)據(jù)類型的RTTI信息本文排版格式為:正文由窗口自動換行;所有代碼以80字符為邊界;中英文字符以空格符分隔。(作者保留對本文的所有權(quán)利,未經(jīng)作者同意請勿在在任何公共媒體轉(zhuǎn)載。)正文⊙RTTI簡介RTTI(Run-TimeTypeInformation)翻譯過來的名稱是“運行期類型信息”,也就是說可以在運行期獲得數(shù)據(jù)類型或類(class)的信息。這個RTTI到底有什么用處,我現(xiàn)在也說不清楚。我是在閱讀Delphi持續(xù)機制的代碼中發(fā)現(xiàn)了很多RTTI的運用,只好先把RTTI學習一遍。下面是我的學習筆記。如果你發(fā)現(xiàn)了錯誤請告訴我。謝謝!Delphi的RTTI主要分為類(cl

3、ass)的RTTI和一般數(shù)據(jù)類型的RTTI,下面從類(class)開始?!杨?class)和VMT的關(guān)系一個類(class),從編譯器的角度來看就是一個指向VMT的指針(在后文用VMTptr表示)。在類的VMTptr的負地址方向存儲了一些類信息的指針,這些指針的值和指針所指的內(nèi)容在編譯后就確定了。比如VMTptr-44的內(nèi)容是指向類名稱(ClassName)的指針。不過一般不使用數(shù)值來訪問這些類信息,而是通過System.pas中定義的以vmt開頭的常量,如vtmClassName、vmtParent等來訪問。類的方法有兩種:對象級別的方法和類級別的方法。兩者的Self指針意義

4、是不同的。在對象級別的方法中Self指向?qū)ο蟮刂房臻g,因此可以用它來訪問對象的成員函數(shù);在類級別的方法中Self指向類的VMT,因此只能用它來訪問VMT信息,而不能訪問對象的成員字段?!杨?class)、類的類(classofclass)、類變量(classvariable)的關(guān)系上面說到類(class)就是VMTptr。在Delphi中還可以用classof關(guān)鍵字定義類的類,并且可以使用類的類定義類變量。從語法上理解這三者的關(guān)鍵并不難,把類當成普通的數(shù)據(jù)類型來考慮就可以了。在編譯器級別上表現(xiàn)如何呢?為了簡化討論,我們使用TObject、TClass和TMyClass來代表上面

5、說的三種類型:type?TClass=classofTObject;var?TMyClass:TClass;25?MyObject:TObject;begin?TMyClass:=TObject;?MyObject:=TObject.Create;?MyObject:=TClass.Create;?MyObject:=TMyClass.Create;end;?在上面的例子中,三個TObject對象都被成功地創(chuàng)建了。編譯器的實現(xiàn)是:TObject是一個VMTPtr常量。TClass也是一個VMTptr常量,它的值就是TObject。TMyClass是一個VMTptr變量,它被賦值

6、為TObject。TObject.Create與TClass.Create的匯編代碼完全相同。但TClass不僅缺省代表一個類,而且還(主要)代表了類的類型,可以用它來定義類變量,實現(xiàn)一些類級別的操作?!裈Object.ClassType和TObject.ClassInfofunctionTObject.ClassType:TClass;begin?Pointer(Result):=PPointer(Self)^;end;TObject.ClassType是對象級別的方法,Self的值是指向?qū)ο髢?nèi)存空間的指針,對象內(nèi)存空間的前4個字節(jié)是類的VMTptr。因此這個函數(shù)的返回值就是

7、類的VMTptr。classfunctionTObject.ClassInfo:Pointer;begin?Result:=PPointer(Integer(Self)+vmtTypeInfo)^;end;TObject.ClassInfo使用class關(guān)鍵字定義,因此是一個類級別的方法。該方法中的Self指針就是VMTptr。所以這個函數(shù)的返回值是VMTptr負方向的vmtTypeInfo的內(nèi)容。TObject.ClassInfo返回的Pointer指針,實際上是指向類的RTTI結(jié)構(gòu)的指針

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。