Druhý ze série článků o java reflection, tedy o balíku java.lang.reflect. Tentokrát o tom, jak nastavovat a získávat hodnoty proměnných třídy

V tomto příkladu budeme předpokládat existenci stejné třídy JavaBean jako minule, tedy :

public class JavaBean {

    private String Jmeno;
    private String Prijmeni;

    public String getJmeno() {
        return Jmeno;
    }

    public void setJmeno(String Jmeno) {
        this.Jmeno = Jmeno;
    }

    public String getPrijmeni() {
        return Prijmeni;
    }

    public void setPrijmeni(String Prijmeni) {
        this.Prijmeni = Prijmeni;
    }

    public String toString() {
        return this.Jmeno + " - " + this.Prijmeni;
    }
}

Dále potřebujeme třídu Main, ze které budeme provádět pokusy:

public class Main {

    public static void main(String[] args) {
        try {
            JavaBean jb = new JavaBean();
            Class c = jb.getClass();

            ...

Čtení a zápis proměnných:
V minulém díle bylo znázorněno,jak získat pole všech proměnných, případně jejich názvů. Teď se zaměříme na jeden nějaký konkrétní. Podmínkou následujících operací je to,že proměnné nejsou s atributem private, tedy je třeba upravit třídu JavaBean v deklaraci proměnných nějak takto:

public class JavaBean {

    public String Jmeno;
    public String Prijmeni;

    ....

Pak přístup k proměnné Jmeno získáme snadno:

Field promennaJmeno= c.getDeclaredField("Jmeno");

Nastavení hodnoty pak provedeme:

promennaJmeno.set(jb,"Pavel");

a získání hodnoty (v našem případě String) provedeme:

String hodnotaJmeno=(String)promennaJmeno.get(jb);

Přístup k private atributům:
Pokud jsou proměnné s atributem private,pak při pokusu o jejich čtení nebo zápis dostaneme tuto vyjímku:

java.lang.IllegalAccessException: Class javareflections.Main can
not access a member of class javareflections.JavaBean with
modifiers "private"

Možnost,jak potlačit kontrolu přístupových atributů je taková:

Field promennaJmenoPotlaceno= c.getDeclaredField("Jmeno");
 promennaJmenoPotlaceno.setAccessible(true);

metoda setAccessible() nastavuje,zda java provede kontrolu atributu pro přístup či nikoli. Parametrem je boolean, v případě true kontrolu neprovádí, false kontrolu vynutí.
Teď již není problém pracovat s proměnnou jako by žádný přístupový modifikátor neměla, tedy:

promennaJmenoPotlaceno.set(jb,"Pavel");
String hodnotaJmeno=(String)promennaJmenoPotlaceno.get(jb);

Aniž bychom dostali jakékoli chybové hlášení.

Varování: tímto postupem porušujeme veškerou logiku JavaBeanu s privátními proměnnými a gettery a settery pro práci s proměnnými, a můžeme tak snadno dosáhnout nekonzistentního stavu JavaBeany, obejdeme možné kontroly a úpravy hodnot v setterech…

Modifikátory(Atributy):
Proměnná může mít tyto modifikátory:
Přístupové atributy: public, protected, and private
Atribut omezení na jednu instanci: static
Atribut zakazující modifikace: final

Modifikátor dané proměnná získáme voláním:

Field atribut = c.getDeclaredField("Jmeno");
Int modifikator = atribut.getModifiers();

Návratová hodnota je typu int, vyjadřuje i několik modifikátorů zároveň, pokud jich je více.
Ideální test na ten či onen modifikátor je použít statické třídy Modifier :

Modifier.isPrivate(arg0);

která vrací true/false podle toho,zda modifikátor je privátní. Těchto testů je samozřejmě v třídě Modifier celá sada,na všechny modifikátory.

Typ proměnné:
získání typu proměnné

Field atribut = c.getDeclaredField("Jmeno");
Type typ = atribut.getType();

Zdroje:
java tutorial