Java programeri se ฤesto suoฤavaju sa situacijama kada treba da rade sa klasama ฤija su imena data kao stringovi. Najฤeลกฤi sluฤaj upotrebe je kada se dinamiฤki kreiraju instanci klase tokom vremena izvoฤenja. Znati kako raditi sa stringovima i pretvarati ih u klasu je neophodna vjeลกtina za svakog programera koji radi sa Javom.
Java Reflection
Za rjeลกavanje ovog problema, Java pruลพa moฤnu funkciju tzv odraz. Reflekcija omoguฤava inspekciju i interakciju sa klasama, interfejsima, poljima i metodama tokom vremena izvoฤenja. Omoguฤava programerima da kreiraju instance klase, pozivaju metode, dobiju ili postave vrijednosti polja i joลก mnogo toga โ sve na osnovu string reprezentacije naziva klase.
Dobivanje klase po imenu stringa
Hajde sada da istraลพimo reลกenje problema dobijanja klase po njenom nazivu stringa. Koristiฤemo Class.forName() metoda, koja je dio Java Reflection API-ja.
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(); } } }
U ovom primjeru koda kreirali smo varijablu niza pod nazivom ClassName i dodijelio mu vrijednost โjava.util.ArrayListโ. Zatim koristimo Class.forName() metoda, koja uzima string className kao argument. Ova metoda vraฤa instancu klase koju pohranjujemo u clazz varijablu tipa razred. Konaฤno, ispisujemo ime klase koristeฤi its getName () metoda.
- Class.forName() โ uฤitava navedenu klasu i vraฤa referencu tipa Class< ?>. Ova metoda ฤe baciti ClassNotFoundException ako klasa nije pronaฤena.
- razred โ generiฤki tip klase koji se koristi za drลพanje reference na uฤitanu klasu.
- getName () โ preuzima potpuno kvalificirano ime klase kao string.
Kreiranje instanci i koriลกtenje metoda klase
Sada kada znamo kako da dobijemo klasu po njenom nazivu stringa, hajde da vidimo kako da kreiramo instancu dobijene klase i da komuniciramo sa njenim metodama i poljima.
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(); } } }
U ovom primjeru prvo dobivamo klasu kao prije koriลกtenja Class.forName(). Zatim kreiramo instancu klase koristeฤi getDeclaredConstructor().newInstance(). Zatim dobijamo metodu โaddโ od klase koja koristi getMethod() i pozovite ga na instanci koristeฤi invoke() metoda sa stringom kao argumentom. Konaฤno, ispisujemo instancu da vidimo rezultat.
Zakljuฤno, Java programeri se ฤesto susreฤu sa scenarijima u kojima treba da dobiju klasu iz stringa i rade sa njenim metodama i poljima tokom vremena izvrลกavanja. Koristeฤi Java Reflection, programeri mogu efikasno da se nose sa ovim situacijama i kreiraju dinamiฤan, prilagodljiv kod. Sa poznavanjem Reflection-a i primjera koda koji su dati u ovom ฤlanku, moลพete se sa sigurnoลกฤu pozabaviti problemom dobivanja klase prema njenom imenu stringa.