Java Reflection – IV. rész
A sorozat eddigi
részeibe a metódusokkal való munkáról beszéltünk részletesebben, az aktuális
rész az osztályváltozókat fogja bemutatni. Ezen a változókról az első
információkat (mint ahogy már megszoktuk eddig is) a Class osztály egy
metódusával lehet lekérdezni, ezen esetbe a getFields függvényt kell
használunk. Ez a függvény visszaad egy Field arrayt, amely minden változót fog
tartalmazni, amit a megadott osztály (amelyet a Class osztállyal tükröztünk)
deklarált.
Vegyük sorra,
mire is képes ez a Field osztály:
Elsősorban,
talán a leghasznosabb függvénye, az a getName() mely visszaadja a nevét a
változónak. Miután a nevet megtudtuk, használván a getType() metódust,
megtudhatjuk a típusát is, vigyázzunk, ez a getType egy Class típusú értéket
térít vissza, tehát le kell ellenőriznünk, hogy valójába mi is az a Class.
Miután megtudtuk
a visszatérési típusát, és ez egy Java alaptipus, használhatjuk az XXX
getXXX(...) függvények közül a megfelelőt, ahol XXX a megfelelő alaptípus.
Amennyiben ez a visszatérési érték nem alaptípus, akkor használjuk az Object
get(...) metódust, amely tetszőleges típust térít vissza. Ezek a
függvények paraméterként mind azt az objektumot várják, amelyben az aktuális
osztályváltozó található. Amennyiben statikus változóról van szó, ez a
paraméter lehet null.
Amennyiben, ez se
elég, használhatjuk a getModifiers metódust, amely visszatéríti a hozzáférés
módosítókat, ezeknek a kikódolására nagyon javallott a Modifiers osztály
használata.
Természetesen az
osztályváltozó értékét nem csak lekérdezni lehet, hanem beállítani is, tehát
minden getXXX függvénynek megvan a maga setXXX párja, amely a megadott objektum
keretein belül a megadott értékre állítja be az osztályváltozót.
És hogy a
szokásos példaprogram is meglegyen: A következő program kilistázza egy
osztály változóit, amennyiben ezek konstansnak és statikusnak
minősülnének, kiírja az értéküket:
import java.lang.reflect.*;
class Test {
private String a;
public static final int i = 234;
}
public class Default {
public static void main(String[] args) {
try {
Class test = Class.forName("Test");
Field[] fields = test.getDeclaredFields();
for(int i=0;i<fields.length;i++)
{
int modifiers = fields[i].getModifiers();
System.out.print(Modifier.toString(modifiers)+" ");
Class type=fields[i].getType();
System.out.print (type.getName()+" ");
System.out.print(fields[i].getName());
if(Modifier.isFinal(modifiers)
&& Modifier.isStatic(modifiers))
{
System.out.println("
= "+fields[i].get(null).toString()+";");
}
else {
System.out.println(";");
}
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}