Vývojáři Java často čelí situacím, kdy potřebují pracovat s třídami, jejichž názvy jsou poskytovány jako řetězce. Nejběžnějším případem použití je dynamické vytváření instancí třídy za běhu. Vědět, jak pracovat s řetězci a převádět je do třídy, je základní dovedností každého vývojáře pracujícího s Javou.
Java Reflection
K vyřešení tohoto problému poskytuje Java výkonnou funkci tzv Odraz. Reflection umožňuje kontrolu a interakci s třídami, rozhraními, poli a metodami za běhu. Umožňuje vývojářům vytvářet instance třídy, vyvolávat metody, získávat nebo nastavovat hodnoty polí a další – vše na základě řetězcové reprezentace názvu třídy.
Získání třídy podle názvu řetězce
Nyní prozkoumáme řešení problému získání třídy podle názvu řetězce. Použijeme Class.forName() metoda, která je součástí Java Reflection API.
public class GetClassFromString { public static void main(String[] args) { try { String className = "java.util.ArrayList"; Class<?> clazz = Class.forName(className); System.out.println("Class: " + clazz.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
V tomto příkladu kódu jsme vytvořili řetězcovou proměnnou s názvem jméno třídy a přiřadili mu hodnotu „java.util.ArrayList“. Dále použijeme Class.forName() metoda, která přebírá řetězec className jako argument. Tato metoda vrací instanci třídy, kterou ukládáme do proměnné clazz typu Třída. Nakonec vytiskneme název třídy pomocí its getName () metoda.
- Class.forName() – načte zadanou třídu a vrátí odkaz typu Class< ?>. Tato metoda vyvolá výjimku ClassNotFoundException, pokud není třída nalezena.
- Třída – generický typ třídy používaný k uchování odkazu na načtenou třídu.
- getName () – načte plně kvalifikovaný název třídy jako řetězec.
Vytváření instancí a používání třídních metod
Nyní, když víme, jak získat třídu podle názvu řetězce, podívejme se, jak vytvořit instanci získané třídy a jak interagovat s jejími metodami a poli.
public class CreateInstanceFromString { public static void main(String[] args) { try { String className = "java.util.ArrayList"; Class<?> clazz = Class.forName(className); Object instance = clazz.getDeclaredConstructor().newInstance(); Method addMethod = clazz.getMethod("add", Object.class); addMethod.invoke(instance, "Hello, world!"); System.out.println("Instance: " + instance); } catch (Exception e) { e.printStackTrace(); } } }
V tomto příkladu nejprve získáme třídu jako před použitím Class.forName(). Dále vytvoříme instanci třídy using getDeclaredConstructor().newInstance(). Poté získáme metodu „add“ ze třídy pomocí getMethod() a vyvolejte jej na instanci pomocí vyvolat() metoda s řetězcem jako argumentem. Nakonec instanci vytiskneme, abychom viděli výsledek.
Závěrem lze říci, že vývojáři Javy se často setkávají se scénáři, kdy potřebují získat třídu z řetězce a pracovat s jejími metodami a poli za běhu. Pomocí Java Reflection mohou vývojáři efektivně zvládnout tyto situace a vytvořit dynamický, adaptabilní kód. Se znalostí Reflection a příkladů kódu uvedených v tomto článku se můžete s jistotou vypořádat s problémem získání třídy podle názvu řetězce.