delphi的rtti机制浅探(完整版)

delphi的rtti机制浅探(完整版)

ID:31686685

大小:84.79 KB

页数:19页

时间:2019-01-17

delphi的rtti机制浅探(完整版)_第1页
delphi的rtti机制浅探(完整版)_第2页
delphi的rtti机制浅探(完整版)_第3页
delphi的rtti机制浅探(完整版)_第4页
delphi的rtti机制浅探(完整版)_第5页
资源描述:

《delphi的rtti机制浅探(完整版)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、ORTTI简介O类(class)和VMT的关系0类(class)、类的类(classofclass)、类变M(classvariable)的关系OTObject.ClassType和TObject.ClassInfoOis和as运算符的原理OTTypelnfo-RTTI信息的结构O获取类(class)的属性(property)信息0获取方法(method)的类型信息O获取有序类型(ordinal).集合(set)类型的RTTI信息O获取其它数据类型的RTT1信息本文排版格式为:正文山窗口自动换行;所有代码以80字符为边界;中英文字符以空

2、格符分隔。(作者保留对木文的所冇权利,未经作者同意请勿在在任何公共媒体转载。)正文ORTTI简介RTTKRun-TimeTypeInformation)翻译过来的名称是藥运行期类型信息S也就是说可以在运行期获得数据类型或类(class)的信息。这个RTT1到底有什么用处,我现在也说不清楚。我是在阅读Delphi持续机制的代码屮发现了很多RTTI的运用,只好先把RTTI学习一遍。卜•面是我的学习笔记。如果你发现了错误请告诉我。谢谢!Delphi的RTT1主要分为类(class)的RTTI和-•般数据类型的RTT1,下面从类(class)开

3、始。0类(class)和VMT的关系一个类(class),从编译器的角度來看就是一个指向VMT的指针(在后文用VMTptr表示)。在类的VMTplr的负地址方向存储了一些类信息的指针,这些指针的值和指针所指的内容在编译后就确定了。比如VMTptr-44的内容是指向类名称(ClassName)W指针。不过-般不使用数值来访问这些类信息,而是通过System.pas中定义的以vmt开头的常屋,如vtmClassName>vmtParent等来访问。类的方法冇两种:对象级别的方法和类级别的方法。两者的Self指针意义是不同的。在对彖级別的方法

4、屮SclF指向对象地址空间,因此可以用它来访问对象的成员函数;在类级别的方法屮Self指向类的VMT,因此只能用它来访问VMT信息,而不能访问对象的成员字段。O类(class)、类的类(classofclass)>类变量(classvariable)的关系上面说到类(class)就是VMTpg在Delphi中还可以用classof关键字定义类的类,并且可以使用类的类定义类变量。从语法上理解这三者的关键并不难,把类当成普通的数据类型來考虑就可以了。在编译器级别上表现如何呢?为了简化讨论,我们使用TObject.TClass和TMyClas

5、s来代表上而说的三种类型:typeTClass=classofTObjcct;varTMyClass:TClass;MyObject:TObject;beginTMyClass:二TObjcct;MyObject:=TObject.Create;MyObject:=TClass.Creaie;MyObject:=TMyCIass.Create;end;在上面的例子中,三个TObjcct对象都被成功地创建了。编译器的实现是:TObjcct是一个VMTPtr常量。TClass也是--个VMTpb常量,它的值就是TObjcct。TMyClas

6、s是-个VMTptr变量,它被赋值为TObjectoTObject.Create与TClass.Create的汇编代码完全相同。但TClass不仅缺省代表一个类,而且还(主耍)代表了类的类型,可以用它來定义类变量,实现一些类级别的操作。0TObject.ClassType和TObject.ClassInfofunctionTObject.ClassType:TClass;beginPointer(Result):=PPointer(Self)A;end;TObject.ClassType是对彖级別的方法,Self的值是指向对彖内存空间的

7、指针,对彖内存空间的前4个字节是类的VMTpir。因此这个函数的返回值就是类的VMTptr。classfunctionTObject.ClassInfo:Pointer;beginResult:=PPointcr(Intcgcr(Sclf)+vmtTypcInfo)A;end;TObject.ClassInfo使用class关键字定义,因此是一个类级别的方法。该方法中的Self指针就是VMTptr。所以这个函数的返回值是VMTp【r负方向的vmtTypelnfo的内容。TObject.ClassInfo返回的Pointer指针,实际上是

8、指向类的RTTI结构的指针。但是不能访问TObject.ClassInfo指向的内容(TObject.ClassInfo返I口I值是0),因为Delphi只在TPersistent类及TPersistent

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。