• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi2010强化的反射

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

很多人可能都发现了,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分发给了最终用户,有兴趣也可以参考一下。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab应用笔记--简单规划求解发布时间:2022-07-18
下一篇:
Delphi的VCL组件库发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap