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,PropertyInfoapod.) - 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: TrueUká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