Professional Documents
Culture Documents
Reflesija: Upravljanje Poljima
Reflesija: Upravljanje Poljima
Reflesija: Upravljanje Poljima
Refleksija nam omogućava da upravljamo arhikteturom same klase prilikom izvršenja programa.
Neka imamo metodu koja prima dva cijela broja a kao povratnu vrijednost neka vraća njihov zbir:
Int saberi(int x, int y) {return x+y}
Primjenom refleksimo, možemo da izmijenimo tijelo metod, tako da nam kao rezultat vraća
proizvod brojeva. Da bi smo mogli manipulisati arhitekturom klase, prvo je moramo identifikovati
u glavnom programu. Neka imamo klasu „KlasaA“ koja ima dva polja, polja „a“ tipa string i polja
„b“ tipa int. Klasu možemo identifikovati tako što koristimo klasu Class (koja sestavni dio paketa
mypackage) kao i njenu statički metodu forName:
Class kA = Class.forName("mojprojekat.KlasaA");
Na taj način smo kreirali objekat „kA“ koji predstavlja klasu „KlasaA“. U slučaju da napišemo klasu
koja ne postoji, editor bi prijavio izuzetak ClassNotFoundException, te je potrebno main metodi
dodati throws oznaku.
Upravljanje poljima
Nakon što smo identifikovali klasu, otvara nam se pristup njezinim poljima i metodama.
Primjenom foreach petlje možemo prikazati nazive polja pomoću metode getName i tipove polja
pomoću metode: getType:
for(Field f: kA.getFields()){
System.out.println("Polje "+f.getName()+" je tipa "+f.getType());
}
U kodu koji ispisali, reflektovanu klasu smo dobili korišćenjem naziva klase. Reflektovanu
klasu, odnosno objekat klase Class možemo dobiti i nad instancom konkretne klase. Često se u
praktičnim uslovima refleksija koristi za otkrivanje polja klase i za postavljanje njihovih
vrijednosti. U sljedećem primjeru, ćemo svakom polju klase, u zavisnosti od tipa podatka dodijeliti
odgovarajuću vrijedost:
KlasaA klasa1=new KlasaA();
Class kA = klasa1.getClass(); //Instanciranje klase
Field[] FKlasaA = kA.getFields(); //Kreiranje niza objekata koji sadrži polja klase
for(Field f: FKlasaA) {
if(f.getType().equals(String.class)) {
f.set(klasa1,"Ovo je tekst");
} else if(f.getType().equals(int.class)){
f.set(klasa1,23);
} else if(f.getType().equals(float.class)){
f.set(klasa1,12.4);
}
}
Vrijednosti polja postavljaju se metodom set, koja kao parametre prima instancu klase i
vrijednost koju želimo da postavimo. Metoda set izbacuje IllegalArgumentException i
IllegalAccessException tako da treba dodamo throws oznake.
Upravljanje metodama
Upravljanje metodama je veoma slično upravljanju poljima. Da bi smo demonstrirali tehniku
upravljanja metodama, kreiraćemo u klasi „KlasaA“ dvije metode:
Class k1 = Class.forName("mojprojekat.KalsaA");
Method[] m1 = k1.getMethods();
for(Method m: m1){
System.out.println(m.getName());
}
Nakon što pokrenemo program, pored naše dvije metode na izlazu ćemo dobiti i metode koje je
klasa KlasaA naslijedila. Da bi na izlazu dobili samo metode koje smo mi kreirali, potrebno je da
umjesto metode getMethods koristimo metodu getDeclaredMethods.
Da bi smo pozvali određenu metodu na izvršavanje, koristićemo metodu invoke:
Class k1 = Class.forName("mojprojekat.KlasaA");
KlasaA ka = new KlasaA();
Method m1 = k1.getMethod("metoda1");
m1.invoke(ka);
Ukoliko pozivamo metodu koja zahtijeva ulazni parametrar, to možemo uraditi na sljedeći način: