
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.