UClassとReflection


1. UClass


コンパイル時間も実行時も、UClass情報はいつでも入手できます.
コンパイル時に[リアルオブジェクトを宣言]のStaticClassを使用します.
実行時にGetClass()関数を使用して参照オブジェクトインスタンスからインポートできます.
StaticClass関数は宣言されていませんが、逆タイトルツールによって自動的に生成されます.
以下は使用したコードです.2つのポインタの値は同じUClassオブジェクトを指します.
UClass* ClassInfo1 = WebConnection->GetClass();
UClass* ClassInfo2 = UWebConnection::StaticClass();

2. Reflection


UClassには、参照オブジェクトのタイプ情報を検索したり、関数を呼び出したり、属性に値を設定したりするレプリケーション機能があります.このためには、非現実オブジェクトクラスのメンバー変数にUPROPERTYマクロを、メンバー関数にUFUNCTIONマクロを指定する必要があります.
UClassに登録されているすべての属性と関数は「FieldIterator」で検索できます.UPPropertyタイプでは、属性値のみを検索し、実行時に特定のインスタンスに割り当てられた属性値を取得できます.
for (TFieldIterator<UProperty> It(ClassInfo1); It; ++It)
{

	UE_LOG(Warning, TEXT("Field : %s, Type : %s"), *It->GetName(), *It->GetClass()->GetName());
        UStrProperty* StrProp = FindField<UStrProperty>(ClassInfo1, *It->GetName());
        if (StrProp)
        {
            AB_LOG(Warning, TEXT("Value = %s"), *StrProp->GetPropertyValue_InContainer(WebConnection));
        }

}
関数リストでは、TFEldIteratorのUFuntionを使用するか、NativeFunctionLookupTable配列(以下のコードで示す)を使用して、現在のクラスにどのC++関数があるかを決定できます.関数の名前を知るだけで、FindFunctionByName関数を使用して参照関数オブジェクトUFunctionを取得し、特定のインスタンスで関数を呼び出すことができます.次に、レプリケーション機能を使用して関数を呼び出す例を示します.
for (const auto& Entry : ClassInfo1->NativeFunctionLookupTable)
{
        AB_LOG(Warning, TEXT("Function = %s"), *Entry.Name.ToString());
        UFunction* Func1 = ClassInfo1->FindFunctionByName(Entry.Name);
        if (Func1->ParmsSize == 0)
        {
            WebConnection->ProcessEvent(Func1, NULL);
        }
}

整理すると、UPROPERTYとUFUNCTIONマクロに指定されたメンバー変数とメンバー関数を「非現実オブジェクト」クラスで検索できます.これらのフィールドのタイプと名前しか知らない場合は、特定のインスタンスで値を変更したり、関数を呼び出したりできます.