Reflexe je mechanismus, který umožňuje programu získávat informace o vlastní struktuře a případně tuto strukturu dynamicky měnit za jeho běhu. Typicky jde o přístup k metadatům programových konstrukcí, jako jsou třídy, metody, vlastnosti nebo členské proměnné, bez nutnosti znát jejich detaily v době kompilace.

Využití reflexe

Reflexe se uplatňuje zejména v oblastech, kde je potřeba:

  • Serializace a deserializace objektů (např. JSON, XML serializace)
  • Dependency injection kontejnerů a IoC frameworků
  • ORM nástrojů (Object-Relational Mapping) mapujících objekty na databázové tabulky
  • Unit testování, kde testovací frameworky vyhledávají metody podle atributů
  • Dynamického načítání modulů nebo pluginů za běhu aplikace
  • Analýzy sestavení (assemblies) a generování kódu

Reflexe v jazyce C#

Reflexe v jazyce C# je dostupná prostřednictvím namespaces System.Reflection a poskytuje API pro:

  • získání informací o typech (Type)
  • přístup k metodám, vlastnostem, polím nebo konstruktorům (MethodInfo, PropertyInfo apod.)
  • dynamické vytváření instancí typů (Activator.CreateInstance)
  • dynamické volání metod (MethodInfo.Invoke)

Ukázka získání metadat datového typu

Type type = typeof(DateTime);
 
Console.WriteLine("Název třídy: " + type.Name);
Console.WriteLine("Namespace: " + type.Namespace);
 
foreach (var prop in type.GetProperties())
{
    Console.WriteLine(prop.Name);
}

Ukázka volání metody

Type t = typeof(string);
MethodInfo method = t.GetMethod("Contains", new Type[] { typeof(string) });
 
bool result = (bool)method.Invoke("Hello world", new object[] { "world" });
Console.WriteLine(result); // Výstup: True

Ukázka dynamické tvorby instance

Type t = Type.GetType("System.Text.StringBuilder");
object sb = Activator.CreateInstance(t);
t.GetMethod("Append", new Type[] { typeof(string) })
 .Invoke(sb, new object[] { "Hello Reflection!" });
 
Console.WriteLine(sb.ToString());

Nevýhody reflexe

  • Výkon - Operace reflexe jsou výrazně pomalejší než přímé volání kódu, protože vyžadují runtime interpretaci metadat.
  • Ztráta typové bezpečnosti - Při práci s reflexí není mnoho chyb detekováno při kompilaci, ale projeví se až za běhu.
  • Bezpečnostní rizika - Reflexe umožňuje přístup k interním nebo privátním částem kódu, což může vést k porušení zapouzdření nebo k bezpečnostním zranitelnostem.
  • Dostupnost - reflexe nemusí být přístupná ve všech případech - např. při kompilaci .NET aplikace v režimu AOT kompilace - tedy kompilace přímo do strojového kódu, tak v tomto režimu není reflexe podporována