delpi中的RTTI初试
java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo:
1.先定义一个demo类,注意这个类必须要以TPersistent为基类,代码如下:
- unit Unit2;
- interface
- { TDemo }
- uses Classes ;
- type
- TDemo = class(TPersistent)
- private
- protected
- public
- FName : string;
- FAge : Integer;
- constructor Create;
- destructor Destroy; override;
- published
- property Name : string read FName write FName;
- property Age : Integer read FAge write FAge;
- end;
- implementation
- { TDemo }
- constructor TDemo.Create;
- begin
- FName := 'peirenlei';
- end;
- destructor TDemo.Destroy;
- begin
- inherited;
- end;
- end.
2.接下来,创建一个这个类的实例:
- ADemo := TDemo.Create;
- ADemo.Name := 'peirenlei';
- ADemo.Age := 0;
3.获取该实例的属性列表:
- var
- APropList:PPropList;
- ATypeInfo:PTypeInfo;
- AClasDateInfo:PTypeData;
- I : Integer;
- begin
- ATypeInfo := ADemo.ClassInfo;
- AClasDateInfo := GetTypeData(ATypeInfo);
- if AClasDateInfo.PropCount <> 0 then
- begin
- //分配空间
- GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- try
- GetPropInfos(ADemo.ClassInfo,APropList); //得到类的属性列表
- for I := 0 to AClasDateInfo.PropCount - 1 do
- begin
- if APropList[I]^.PropType^.Kind <> tkMethod then
- mmo.Lines.Add(Format('%s:%s',[APropList[I]^.Name,APropList[I]^.PropType^.Name]));
- end;
- finally
- FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);
- end;
- end;
- end;
输出:
- Name:string
- Age:Integer
3. 获取类的方法列表:
- var
- APropList:PPropList;
- ATypeInfo:PTypeInfo;
- AClasDateInfo:PTypeData;
- I ,NumPro : Integer;
- begin
- ATypeInfo := ADemo.ClassInfo;
- AClasDateInfo := GetTypeData(ATypeInfo);
- if AClasDateInfo.PropCount <> 0 then
- begin
- //分配空间
- GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- try
- NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);
- if NumPro <> 0 then
- begin
- mmo.Lines.Add('-----events-------');
- for I := 0 to NumPro - 1 do //获得事件属性的列表
- begin
- mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));
- end;
- end;
- finally
- FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- end;
- end;
- end;
4.获取实例类的属性和属性值:
- var
- AProperInfo:PPropInfo;
- AValue:string;
- begin
- AValue := GetPropValue(ADemo,'Name');
- mmo.Lines.Add('Name='+AValue);
- AValue := GetPropValue(ADemo,'Age');
- mmo.Lines.Add('Age='+AValue);
- SetPropValue(ADemo,'Name','zengzhen');
- SetPropValue(ADemo,'Age',100);
- AValue := GetPropValue(ADemo,'Name');
- mmo.Lines.Add('Name='+AValue);
- AValue := GetPropValue(ADemo,'Age');
- mmo.Lines.Add('Age='+AValue);
- end;
输出:
- Name=peirenlei
- Age=0
- Name=zengzhen
- Age=100
http://peirenlei.iteye.com/blog/378465
delpi中的RTTI初试的更多相关文章
- C++中的RTTI机制解析
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...
- C++ 中的RTTI机制详解
前言 RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法.RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使 ...
- Java中的RTTI
RTTI可以帮助我们在运行时识别对象和类的信息. 一般传统的RTTI有三种实现方式: 1. 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子 ...
- Delphi中的Rtti函数
TTypeKind,类型类别,tkclass,tkinteger,tkstring等.类,属性都是一种类型. ttypedata,是一个record包括ttypekind.是一个类的描述.TTypeK ...
- Delphi中关于Rtti的一些操作(一)
function TForm1.ShowMethodAddress(aObj: TDerived; const sData: String) : Pointer;var aPtr : Pointer ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- Java RTTI机制与反射机制
1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
随机推荐
- 使用jstl 截取字符串
时常碰见这样的 问题:获取数据库中的文本域的时候经常是在p标签中的,在页面显示的时候也是带着p标签,如何去除p标签呢 这里提供一个使用jstl的方式 1.首先导入jstl的函数标签库 <%@ t ...
- ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解
原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details 方法 打开M ...
- java代码中获取进程process id(转)
另一方面,线程ID=进程ID+内部线程对象ID并不成立, 参考: blog.csdn.net/heyetina/article/details/6633901 如何在java代码中获取进 ...
- 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列 ...
- xp每天定时关机命令
at 00:00 /every:M,T,W,Th,F,S,Su shutdown -s -t 120 能够把00:00改成你想要每天定时关机的时间,120是指关机倒计时的秒数,也能够更改 M,T,W, ...
- SQL SERVER 2008R2sp1配置Database Mail –用SQL 数据库发邮件
步骤1)创建配置文件和帐户 看图片吧,挺简单的: 中间略过的一些步骤,就点下一步即可. 下面我们测试一下: Step 2)配置邮件: 在完成账户和配置文件创建之后,我们需要配置Database Mai ...
- Bmp 解析 (2013-09-09 19:30:41)
bmp 图片结构 位图格式(bmp)是显示图片的基本格式,其文件扩展名为*.BMP. 在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图才能显示出来,其他各种格式的图片文件是在位图格 ...
- python中eval, exec, execfile,和compile [转载]
eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果. 同样地, exec语句将字符串str当成有效Python代码来执行. ...
- Android圆环形颜色选择器:HoloColorPicker
HoloColorPicker实现圆环形颜色选择器,可以改变颜色饱和度来选择颜色.选择颜色时,可以用手指沿着圆环滑动一个滑块,从而选择颜色. 添加以下XML至你的布局中: ? 1 2 3 4 < ...
- ASIHTTPRequest-插件的使用
链接地址:http://blog.sina.com.cn/s/blog_7b9d64af0101e5uf.html 一.什么是ASIHTTPRequest ASIHTTPRequest 插件是一个 ...