请教Delphi大牛,Delphi的RTTI可以获取到某个类的所有属性\方法\过程吗?
就是只给出这个类的一个实例,然后通过枚举的方式,将所有方法\属性\过程都枚举出来,听说Delphi的RTTI只对published域的过程有效,有什么办法能绕过去吗,给个思路也好啊`谢谢!

解决方案 »

  1.   

    估计星期六日高手都去HAPPY去了...明天再来..
      

  2.   

    的确,只有published域有RTTI在运行期得到全部属性、成员的可能性不太大,
    “正常”的办法应该是没有,因为这违反OO的封装原则
      

  3.   

    终于有人了
    现有这个声明
    TMyMethod = function(A: array of Char; var B: TObject): Integer of object;我用GetTypeData可以返回这个原型的信息,但网上说delphi的rtti只对pubshlied有效,那为为什么能取到呢?还有就是TypeInfo为啥不能传个TForm1.Create进去?我是想拿到TForm1.Create的信息
      

  4.   

    嘿嘿`我找到了,通过那些虚表以后的一些地址,能拿到所有字段和方法的首地址,这样的话,其实Delphi的所有类对象都具有RTTI的功能了,不知道官方说什么说继承于TPrexxx这个类才具有RTTI.
      

  5.   

    晕..原来vmtMethodTable只对pubshlied域有效...........我日..
      

  6.   

    oh?vmtMethodTable对全部都有效吧,我试过的。RTTI对published有效。
      

  7.   

    Harryfin(Harry) 这位兄弟此话当真???我没去试``今晚回去试试```brightyang(伊莎贝尔)你也是指vmtMethodTable这个方法来获取?
      

  8.   

    关注
    请教一下:vmtMethodTable是记虚方法的,跟RTTI的实现有什么关系吗?to
    Harryfin(Harry)
    vmtMethodTable对全部都有效吧,你说的是做什么操作全部都有效呢?
      

  9.   

    vmtSelfPtr           = -76;
      vmtIntfTable         = -72;
      vmtAutoTable         = -68;
      vmtInitTable         = -64;
      vmtTypeInfo          = -60;
      vmtFieldTable        = -56;
      vmtMethodTable       = -52;
      vmtDynamicTable      = -48;
      vmtClassName         = -44;
      vmtInstanceSize      = -40;
      vmtParent            = -36;
      vmtSafeCallException = -32 deprecated;  // don't use these constants.
      vmtAfterConstruction = -28 deprecated;  // use VMTOFFSET in asm code instead
      vmtBeforeDestruction = -24 deprecated;
      vmtDispatch          = -20 deprecated;
      vmtDefaultHandler    = -16 deprecated;
      vmtNewInstance       = -12 deprecated;
      vmtFreeInstance      = -8 deprecated;
      vmtDestroy           = -4 deprecated;  vmtQueryInterface    = 0 deprecated;
      vmtAddRef            = 4 deprecated;
      vmtRelease           = 8 deprecated;
      vmtCreateObject      = 12 deprecated;看上面,有了这些值,就能获取到任意类对象的所有方法\属性\动态表\等等信息了嘛,有了反射的基本功能,但是对于动态创建之类的,在delphi里是不是所有对象都支持```全部就是指private\protected\public\pubshlied这些域的方法\属性有效
      

  10.   

    在Types单元里,自己找吧,都是些未公开的函数,一般可以满足要求了
      

  11.   

    可以参考一下:
    http://blog.yd153.com/user1/wyattwriy/archives/2007/200.html
      

  12.   

    to
    Harryfin(Harry)
    vmtMethodTable对全部都有效吧,你说的是做什么操作全部都有效呢?类的成员方法 -_-