delpi中的RTTI初试

java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo:

1.先定义一个demo类,注意这个类必须要以TPersistent为基类,代码如下:

Delphi代码  

  1. unit Unit2;
  2. interface
  3. { TDemo }
  4. uses  Classes ;
  5. type
  6. TDemo = class(TPersistent)
  7. private
  8. protected
  9. public
  10. FName : string;
  11. FAge : Integer;
  12. constructor Create;
  13. destructor Destroy; override;
  14. published
  15. property Name : string read FName write FName;
  16. property Age : Integer read FAge write FAge;
  17. end;
  18. implementation
  19. { TDemo }
  20. constructor TDemo.Create;
  21. begin
  22. FName := ‘peirenlei‘;
  23. end;
  24. destructor TDemo.Destroy;
  25. begin
  26. inherited;
  27. end;
  28. end.

2.接下来,创建一个这个类的实例:

Delphi代码  

  1. ADemo := TDemo.Create;
  2. ADemo.Name := ‘peirenlei‘;
  3. ADemo.Age := 0;

3.获取该实例的属性列表:

Delphi代码  

  1. var
  2. APropList:PPropList;
  3. ATypeInfo:PTypeInfo;
  4. AClasDateInfo:PTypeData;
  5. I : Integer;
  6. begin
  7. ATypeInfo := ADemo.ClassInfo;
  8. AClasDateInfo := GetTypeData(ATypeInfo);
  9. if AClasDateInfo.PropCount <> 0 then
  10. begin
  11. //分配空间
  12. GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  13. try
  14. GetPropInfos(ADemo.ClassInfo,APropList);  //得到类的属性列表
  15. for I := 0 to AClasDateInfo.PropCount - 1 do
  16. begin
  17. if APropList[I]^.PropType^.Kind <> tkMethod then
  18. mmo.Lines.Add(Format(‘%s:%s‘,[APropList[I]^.Name,APropList[I]^.PropType^.Name]));
  19. end;
  20. finally
  21. FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);
  22. end;
  23. end;
  24. end;

输出:

Delphi代码  

  1. Name:string
  2. Age:Integer

3. 获取类的方法列表:

Delphi代码  

  1. var
  2. APropList:PPropList;
  3. ATypeInfo:PTypeInfo;
  4. AClasDateInfo:PTypeData;
  5. I ,NumPro : Integer;
  6. begin
  7. ATypeInfo := ADemo.ClassInfo;
  8. AClasDateInfo := GetTypeData(ATypeInfo);
  9. if AClasDateInfo.PropCount <> 0 then
  10. begin
  11. //分配空间
  12. GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  13. try
  14. NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);
  15. if NumPro <> 0 then
  16. begin
  17. mmo.Lines.Add(‘-----events-------‘);
  18. for I := 0 to NumPro - 1 do //获得事件属性的列表
  19. begin
  20. mmo.Lines.Add(Format(‘%s:%s‘,[APropList[i]^.Name,APropList[i]^.PropType^.Name]));
  21. end;
  22. end;
  23. finally
  24. FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  25. end;
  26. end;
  27. end;

4.获取实例类的属性和属性值:

Delphi代码  

  1. var
  2. AProperInfo:PPropInfo;
  3. AValue:string;
  4. begin
  5. AValue := GetPropValue(ADemo,‘Name‘);
  6. mmo.Lines.Add(‘Name=‘+AValue);
  7. AValue := GetPropValue(ADemo,‘Age‘);
  8. mmo.Lines.Add(‘Age=‘+AValue);
  9. SetPropValue(ADemo,‘Name‘,‘zengzhen‘);
  10. SetPropValue(ADemo,‘Age‘,100);
  11. AValue := GetPropValue(ADemo,‘Name‘);
  12. mmo.Lines.Add(‘Name=‘+AValue);
  13. AValue := GetPropValue(ADemo,‘Age‘);
  14. mmo.Lines.Add(‘Age=‘+AValue);
  15. end;

输出:

Delphi代码  

  1. Name=peirenlei
  2. Age=0
  3. Name=zengzhen
  4. Age=100

http://peirenlei.iteye.com/blog/378465

时间: 2024-10-08 07:31:48

delpi中的RTTI初试的相关文章

MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)

在MFC中的RTTI的实现,主要是利用一个名为CRuntimeClass的结构来链接各个"有关系的类"的信息来实现的.简单来说,就是在需要用到RTTI技术的类内建立CRuntimeClass的静态变量,来储存该类的相关信息(包括类名.基类的CRuntimeClass结构的指针.让"有关系的类"的信息形成链表的next指针.以及链表的首指针(静态)等信息),这里的"有关系"指的是从同一个基类继承下来的所有的类之间的关系.这些信息(CRuntimeC

C++中的RTTI机制解析

RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系.和很多其他语言一样,C++是一种静态类型语言.其数据类型是在编译期就确定的,不能在运行时更改.然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致

C++中的RTTI(转)

转自:http://blog.csdn.net/mannhello/article/details/5217954 RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI:本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和 dynamic_cast. 其实,RTTI 在

Delphi中的Rtti函数

TTypeKind,类型类别,tkclass,tkinteger,tkstring等.类,属性都是一种类型. ttypedata,是一个record包括ttypekind.是一个类的描述.TTypeKing只是这许多描述中的一种. GetTypeData函数,获取类的相关信息,当然也包括属性的信息,比如属性published中的proptery的个数等 GetPropList,获取属性信息列表,包括属性名,属性的类型等 GetPropInfo/GetPropInfos 获取类的属性的相关信息,功

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

RTTI技术

在C++中通过虚函数,模板编程和RTTI技术可以实现多态.关于虚函数和模板编程不再赘述,下面来介绍RTTI技术. 所谓RTTI技术,是Run Time Type Infomation的缩写,即运行时类型信息.它提供了运行时确定对象类型的方法.对于大多数人而言,可能都不知道在C++中还有RTTI.其实在C++编程中有时候不可避免地需要对对象类型进行动态判断,那么如何确定对象的动态类型呢? 答案就是使用C++内置的RTTI运算符typeid和dynamic_cast. 详细参考:http://blo

RTTI的实现(vc)--转载

RTTI (Run Time Type info) 这个神奇的东西用于存储类的相关信息,用于在运行时识别类对象的信息.C++ 里面只记录的类的名字和类的继承关系链.使得编译成二进制的代码,对象可以知道自己的名字(ASCII),以及在继承链中的位置. C++ 里面提供 一个关键字 typeid , 一个数据类型 typeinfo,以及对应的头文件 typeinfo.h 1 #include <iostream> 2 #include <typeinfo> 3 using namesp

Delphi 的RTTI机制浅探&lt;一&gt;

目 录===============================================================================⊙ DFM 文件与持续机制(persistent)⊙ ReadComponentResFile / WriteComponentResFile 函数⊙ Delphi 持续机制框架简述⊙ 一个 TForm 对象的创建过程⊙ TStream Class 和 TStream.ReadComponent 方法⊙ TReader Class 和

Java RTTI机制与反射机制

1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Identification) refers to a C++ mechanism that exposes information about an object's data type at runtime. Run-time type information can apply to simple d