Delphi2010强化的反射

转载 2011年01月09日 21:31:00

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

利用反射机制,读取dll,并调用其中的方法

        private void UserJN(string dllName,string className,string methodName)        {            s...
  • jn1705
  • jn1705
  • 2010年07月01日 16:43
  • 344

delphi RTTI 反射技术

unit Unit_main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Control...
  • earbao
  • earbao
  • 2015年07月02日 18:14
  • 3449

利用C#的反射机制动态调用DLL类库

1、使用Assembly类定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 2、使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pul...
  • 3150379
  • 3150379
  • 2015年03月07日 17:49
  • 1580

Delphi2010强化的反射

Delphi2010强化的反射 2009-09-02 13:18 很多人可能都发现了,Delphi2010编译后的程序体积非常大,一个空的窗体居然达到接近800K。这些多出来的体积其实就是运行时信...
  • ilvu999
  • ilvu999
  • 2011年12月26日 07:54
  • 357

Delphi2010强化的反射(续)

上一篇文章讲了Delphi2010下对于类的反射,文章一发出来,马上就有人说,Record不行。我自己试了下,还真不行,因为那个GetType()方法不能把Record直接传入,试了一下用FindTy...
  • ilvu999
  • ilvu999
  • 2011年12月26日 07:52
  • 312

减小Delphi2010程序的尺寸(关闭RTTI反射机制)

====================================================== 注:本文源代码点此下载 =============================...

关闭RTTI反射机制,减小Delphi2010程序的尺寸

关闭RTTI反射机制,减小Delphi2010程序的尺寸
  • shuaihj
  • shuaihj
  • 2011年01月09日 20:45
  • 3576

关闭RTTI,减小Delphi2010程序的尺寸

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前...
  • nhconch
  • nhconch
  • 2013年04月16日 14:17
  • 1784

Delphi2010Ping某IP是否连通的代码实现

很多时候不检查局域网内的IP是否连通,直接通过IP访问,程序会卡住很久,有1分钟左右,这给用户的体验非常不好,现在通过检查是否连通,设置为1.5S后不连通则不进行后面的操作,程序效率大大提升,如下是检...

DELPHI DATASNAP 2010 入门操作(2)不写一行代码,绿色三层我也行

有一行代码的三层,功能肯定非常的简单,但是,再简单,我们也三层了,学习一个东西,需要从入门开始就有兴趣,如果入门就给吓怕了,哪么后来何来信心学习呢?现在就让我们开始吧,不只是没有华丽的词语,而是连用词...
  • xxhh07
  • xxhh07
  • 2011年09月10日 14:30
  • 1185
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi2010强化的反射
举报原因:
原因补充:

(最多只允许输入30个字)