Delphi2010的RTTI增强
Delphi编译的文件体积增大了很多.很大一部分原因是因为Delphi2010默认提供了全信息的RTTI.
每一个数据类型都有全部运行时信息.例如可以在运行时获得结构体的成员以及成员类型等.
这个功能带来的方便就是我们可以写很多通用的序列化方法.也可以做一些类似OR的东西.
相反这个功能带来的缺点就是文件体积将增大.
不过有一个解决方案.就是把运行时信息的编译开关关掉.但是编译期间连接的库在Lib目录下.这些DCU文件却都是带RTTI信息的.所以编译出来的内容也会是非常大的.就只有修改VCL源代码,全部关掉运行时信息的编译开关.然后把代码编译成DCU.放在LibNORTTI目录下.然后把Delphi项目的Lib路径指向这里.就可以达到去掉RTTI信息缩小可执行文件体积的目的了.不过貌似CodeGear应该在Delphi上加上一个选项,然后编译出两套VCL的DCU.根据不同选项连接不同目录下的DCU文件.我想CodeGear之所以没有这样做的原因应该是怕影响编译出来程序的一致性吧.
好了我们初步探索一下增强的RTTI吧.说起来很简单.
第一步uses RTTI;
然后照搬模式:
var
r : TRttiContext;
begin
r := TRttiContext.Creat();
写获取RTTI信息的代码
r.Free;
end;
TRttiContext的方法
GetTypes是获取系统内全部类型的类型信息数组.返回值类型是TArray<TRttiType>.(用到了从Delphi2009以来增加的泛型)
FindType是按名字找查找类型信息.
GetPackages是返回运行时包
GetType有两个重载方法.
function GetType(ATypeInfo: Pointer): TRttiType; overload;可以返回任何指定类型的类型嘻嘻
function GetType(AClass: TClass): TRttiType; overload;仅仅对Class有效.
下面就举个例子:
type
TTestRecord = record
a:string;
b:Integer;
c:Double;
end;
TTestClass = class
private
a:string;
b:Integer;
c:Double;
end;
var
r : TRttiContext;
rt : TRttiType;
f : TRttiField;
begin
r := TRttiContext.Create();
rt := r.GetType(TTestClass);
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format('%s.%s:%s',[rt.Name, f.Name, f.FieldType.Name])));
end;
r.Free;
end;
在Delphi的EventLog中就可以看到TTestClass的成员,不关它是私有还是公有的.
结构体和其他类型则可以用function GetType(ATypeInfo: Pointer): TRttiType;这个方法,当然这个方法也可以处理Class类型
所区别就在于要加上TypeInfo操作符取回类型信息指针.
var
r : TRttiContext;
rt : TRttiType;
f : TRttiField;
begin
r := TRttiContext.Create();
rt := r.GetType(TypeInfo(TTestClass));
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format('%s.%s:%s',[rt.Name, f.Name, f.FieldType.Name])));
end;
rt := r.GetType(TypeInfo(TTestRecord));
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format('%s.%s:%s',[rt.Name, f.Name, f.FieldType.Name])));
end;
r.Free;
end;
http://blog.csdn.net/wr960204/article/details/4584503
Delphi2010的RTTI增强的更多相关文章
- Delphi XE的RTTI增强,动态Hook某些内部事件
Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下: Delphi2010 ...
- Delphi里的RTTI与反射(举例换掉FOnChange)
Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...
- 有关Delphi RTTI的一些文章
Delphi RTTI 资料 Delphi 的RTTI机制浅探 Delphi XE的RTTI增强,动态Hook某些内部事件
- 减小Delphi2010程序的尺寸(关闭RTTI反射机制)
自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前 ...
- Delphi XE增强的RTTI妙用--动态创建包中的窗口类
以前要在运行时创建package中的form类,必须要在form单元文件中这样注册类: Initialization RegisterClass(TForm3);Finalization UnRe ...
- Delphi2010 RTTI + Attribute 简单实现ORM实例
1.支持ORM,最基础的两个信息是表的信息和字段信息.这两个信息,如果用Attribute 来辅助,代码更简洁和可读性更好.可以把属性名当做真实字段名,也可以将特性里的属性当成真实姓名,再加上字段标题 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...
随机推荐
- nginx upstream setting
upstream proxy_1 { server 127.0.0.1:8080; #连接到上游服务器的最大并发空闲keepalive长连接数(默认是未设置,建议与Tomcat Connector中的 ...
- Java提高学习之Object(4)
哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...
- Arduino周边模块:执行部件(舵机、直流电机、步进电机)
Arduino周边模块:执行部件 Arduino周边模块:执行部件 嵌入式系统的构成 如今已经有各种各样的基于Arduino的嵌入式系统, 比如:智能小车.3D打印机.机器人,甚至还有基于Arduin ...
- Zend Studio错误总结
1.在升级了wampserver之后,用zendstudio发现很多地方都出错了,这时候一般先要project-clean一下,然后到run 和 debug的configuration里面把除了stu ...
- linux命令学习02-通过tomcat学习ps和netstat
问题:如何查找tomcat进程,以及tomcat占用的端口号? 1.ps -ef|grep tomcat root 1984 1 19 10:20 ? 00:00:10 /opt/jdk1.7.0_8 ...
- python递归函数下不能正常使用yield
# -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdi ...
- [LeetCode]题解(python):154-Find Minimum in Rotated Sorted Array II
题目来源: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 题意分析: 给定一个有重复的翻转的数组,找到最 ...
- Generator & Co
Generator 搬运自 http://es6.ruanyifeng.com/#docs/generator 如果没有babel等环境也可以在线体验 可以在http://www.es6fiddle. ...
- MVC自学第二课
鉴赏一个软件开发框架最好的办法是投入其中并使用它.本课将使用ASP.NET MVC框架创建一个简单的数据录入应用程序.为简化起见,本课涉及到的一些技术细节在这里可能会跳过,会在以后的课程中再详细说明. ...
- SAR 图像
http://www.dlr.de/hr/en/desktopdefault.aspx/tabid-2326/3776_read-5679/