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,邏輯相同
Fun1PublishedFun2 (預設區段) 和 Fun2PublishedFun3、Fun3Public、Fun3Published (含 public 區段)ObjAuto 單元配合 {$METHODINFO ON} 指令,讓 Delphi 2009 具備了接近 .NET/C# 的反射能力,突破了傳統 RTTI 只能存取 published 區段的限制,為動態型別程式設計開闢了新路徑。