Delphi2010强化的反射

简介: 很多人可能都发现了,Delphi2010编译后的程序体积非常大,一个空的窗体居然达到接近800K。这些多出来的体积其实就是运行时信息,使用这些信息,我们可以轻松的获取到有关的类内容,并在不知情的情况下使用它们。

很多人可能都发现了,Delphi2010编译后的程序体积非常大,一个空的窗体居然达到接近800K。这些多出来的体积其实就是运行时信息,使用这些信息,我们可以轻松的获取到有关的类内容,并在不知情的情况下使用它们。这个特性对于实现多层的架构有着非同一般的意义。
Delphi2010提供了一个Rtti单元,用于实现运行时信息的Get, Set。
在其中能找到一个名为TRttiContext的Record,它就是本文的主角了。TRttiContext提供了一个静态的构造方法,也就是说,我们无需手工的创建它。新建一个窗体,然后在public下写入 Ref: TRttiContext; 即可完成声明,以后就能直接使用了。(此处的Ref可以按需求修改成任何的合法变量名)
在此我写了一个类,用来做测试,如下(Delphi2010已不再要求用{$MethodInfo}来标识用于反射的信息)

接着就是用代码来获取类的信息了,我在窗体上放了一个TMemo并命名为mm,用于输出信息。
如下:

这是一个很通用的方法,对于任意的类都能调用这个方法来显示它的有关信息。
在窗体的Create事件中,再写一点调用的代码:

到此为止我们先运行一下程序,看看效果,如图所示,TTestClass的信息已经全部输出了。
有人可能会问,为什么只写了两个方法,反射却得到那么多方法呢?那是因为反射机制会同时得到父类的内容。

注意到什么了吗?那三个Field,代码中是private下的,居然拿到了!而同在private下的GetXY()方法却没有得到。暂时还无法确定是否反射单元的bug,或是原本就如此设计。总之现在,我们该拿到的东西都拿到了,不该拿到的也有一部分拿到了。
好了,上面的部分只是“显示”出一个类的信息,对于反射机制来说,只是显示是完全不够的,还要能够调用。很幸运的是,Delphi2010不仅在获取上做了改进,而且调用也方便了很多。
以下的代码是调用TTestClass内的DoAdd()方法:

再来一个给成员变量赋值的代码:

是不是觉得反射用起来很方便呢?不仅仅是类,Record, Set, 有序类型和一些其他的东西在Delphi2010下也都拥有运行时信息,可以被动态获取到。官方提供了一个名为rtti_browser的演示程序,随Delphi2010分发给了最终用户,有兴趣也可以参考一下。

相关文章
|
3月前
|
Go
反射机制全解析:揭秘语言内幕
反射机制全解析:揭秘语言内幕
25 0
|
7月前
|
开发框架 缓存 安全
C#OOP之十三 组件、程序集与反射
C#OOP之十三 组件、程序集与反射
37 0
|
9月前
【软工】原型化方法与常用动态分析方法
【软工】原型化方法与常用动态分析方法
39 0
|
9月前
|
安全 Java 测试技术
带你深入学习“反射”技术
带你深入学习“反射”技术
76 0
|
10月前
|
设计模式 JSON 数据格式
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(上)
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(上)
88 0
|
10月前
|
JSON 数据库 数据格式
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(下)
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(下)
82 0
|
应用服务中间件
反射知识梳理
反射知识梳理
100 0
|
Java Android开发 数据库管理
Android插件化开发基础之Java反射机制研究(1)
Android插件化开发基础之Java反射机制研究(1)
105 0
|
Java Android开发 索引
Android插件化开发基础之Java反射机制研究(2)
Android插件化开发基础之Java反射机制研究(2)
109 0
|
算法
反射的另类实现。(不知道这么用还算不算反射了?)
在asp.net里面实现反射除了用 Assembly.Load("SMS").CreateInstance("SMS.短信" + 短信开头的编号)  之外还有没有其它的方法呢? .net里面有UserControl ,而UserControl 又可以使用 Page.LoadControl("UC_Show1.ascx") 的方式来加载。
871 0

热门文章

最新文章