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();

      }

   }

}

Deák Ferenc