首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 反射機制:ObjAuto 單元深度解析與 Public 成員存取

     編輯:Delphi

前言:突破 RTTI 的限制

Delphi 的傳統 RTTI (Run-Time Type Information) 僅能存取 published 區段的成員,這在需要動態檢視類別完整結構時極為不便。Delphi 2009 引入的 ObjAuto 單元擴展了反射能力,提供 5 個核心方法:

  • GetMethods、GetMethodInfo:取得方法詳細資訊
  • CreateMethodPointer、ReleaseMethodPointer:方法指標管理
  • ObjectInvoke:動態呼叫方法

關鍵差異在於:ObjAuto 能存取 public 區段成員,而傳統 TypInfo 單元只能存取 published 區段。

編譯指令控制反射可見性

Delphi 使用編譯指令控制成員是否納入反射資訊:

類別定義編譯指令可見成員範圍
TClass1無特殊指令僅 published
TClass2{$M+}published + 預設區段 (相當於 public)
TClass3{$M+}{$METHODINFO ON}public、published、預設區段全可見

執行效果圖

核心程式碼實作

測試類別單元

unit Unit2;
interface
type
  // 僅 published 可見
  TClass1 = class
    function Fun1: string;
    private function Fun1Private: string;
    protected function Fun1Protected: string;
    public function Fun1Public: string;
    published function Fun1Published: string;
  end;

  // {$M+} 開啟,預設區段視同 published
  {$M+}
  TClass2 = class
    function Fun2: string; {預設區段}
    private function Fun2Private: string;
    protected function Fun2Protected: string;
    public function Fun2Public: string;
    published function Fun2Published: string;
  end;
  {$M-}

  // {$METHODINFO ON} 讓 public 區段可見
  {$M+}
  {$METHODINFO ON}
  TClass3 = class
    function Fun3: string;
    private function Fun3Private: string;
    protected function Fun3Protected: string;
    public function Fun3Public: string;
    published function Fun3Published: string;
  end;
  {$METHODINFO OFF}
  {$M-}
implementation
// ... 方法實作略 ...
end.

主表單呼叫程式碼

uses ObjAuto, Unit2;

procedure TForm1.Button1Click(Sender: TObject); // TClass1
var
  MiArr: TMethodInfoArray;
  Mi: PMethodInfoHeader;
  obj: TClass1;
begin
  obj := TClass1.Create;
  try
    MiArr := GetMethods(obj.ClassType);
    ListBox1.Clear;
    for Mi in MiArr do
      ListBox1.Items.Add(string(Mi.Name));
  finally
    obj.Free;
  end;
end;

// Button2Click 對應 TClass2,Button3Click 對應 TClass3,邏輯相同

執行結果分析

  • Button1 (TClass1):僅列出 Fun1Published
  • Button2 (TClass2):列出 Fun2 (預設區段) 和 Fun2Published
  • Button3 (TClass3):列出 Fun3、Fun3Public、Fun3Published (含 public 區段)

實務應用場景

  • 動態插件系統:掃描類別公開介面自動註冊功能
  • 物件序列化/反序列化:無需預先定義屬性對應
  • 測試框架:自動發現並執行測試方法
  • GUI 產生器:根據類別結構動態建立介面

總結

ObjAuto 單元配合 {$METHODINFO ON} 指令,讓 Delphi 2009 具備了接近 .NET/C# 的反射能力,突破了傳統 RTTI 只能存取 published 區段的限制,為動態型別程式設計開闢了新路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved