Ukázka reflexe v Javě

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Jednoduchá ukázka práce s reflexí. Tato ukázka vznikla úplně neúmyslně a náhodně. sczdavos chtěl poradit jak má dostat ze třídy Color názvy definovaných barev + jejich hodnoty. Napsal jsem mu to a pak ten "šupák" :D řekl že je to moc dlouhý a nechtěl by to vysvětlovat v ukázkovém programu pro androida a nakonec si to napsal podle sebe. Tak aspoň sem hodím kód jako ukázku.

import java.awt.Color;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Třída demonstrující práci s reflexí
 * @author Fugiczek
 */
public class ListColors {

    /**
     * List proměnných, tedy barev
     */
    private List<Field>barvy;
    /**
     * Třída s barvami
     */
    private Class<? extends Color> clazz = Color.class;

    /**
     * Konstruktor
     */
    public ListColors(){
        setFieldColors();
    }

    /**
     * Naplní náš list barvami
     */
    private void setFieldColors(){
        Field [] fields = clazz.getDeclaredFields(); //získání všech deklarovaných proměnných ze třídy
        Field [] barvy_all = new Field[fields.length-7]; //zmenšení pole tak aby se tam vešli jen barvy a nebyli navíc proměnné které nechceme
        System.arraycopy(fields, 0, barvy_all, 0, fields.length-7); //překopírování

        barvy = new ArrayList<>(Arrays.asList(barvy_all)); //vytvoření listu z pole barvy_all abychom mohli mazat prvky duplicitní

        for(int i = 0;i<barvy.size();i++){
            if(i<barvy.size()-1){
              if(barvy.get(i).getName().equalsIgnoreCase(barvy.get(i+1).getName().replace("_", ""))){
                  barvy.remove(i); //mazání barev tak aby zbyli jen ty co mají název velkými písmeny
                  i--;
              }
            }
        }
    }

    /**
     * Vypsání všech barev v jejich hodnoty
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    private void enumeration() throws IllegalArgumentException, IllegalAccessException{
        for(Field f : barvy){ //projetí cyklem for-each
            Color col = (Color) f.get(clazz); //získání objektu
            String rgb = Integer.toHexString(col.getRGB()); //převedení hodnoty barvy do hexadecimální
            rgb = rgb.substring(2, rgb.length()); //smazání prefixu 0x
            System.out.println(f.getName() + "->" + rgb);
        }
    }

    public static void main(String[]args){
        ListColors lc = new ListColors();
        try {
            lc.enumeration();
        } catch (Exception e) { //chyba vzniká když je proměnná nastavená jako private, což v našem případě není
            System.out.println("Chyba v přístupu k proměnné " + e.getMessage());
        }
    }

}

Galerie

Program byl vytvořen v roce 2012.

 

Všechny články v sekci
Zdrojákoviště Java - Objektově orientované programování
Program pro vás napsal Fugiczek
Avatar
Jak se ti líbí článek?
1 hlasů
Aktivity (3)

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:29.4.2013 10:37

Udělal jsem si v Javě takový jednoduchý program na reflexi, který používám místo referenčního manuálu. Je až k nevíře, co všechno se dá vytahat nejen ze systémových, ale i z vlastních knihoven. V případě zájmu ho také můžu vystavit, i když ho neustále upravuji podle aktuálních potřeb.

Odpovědět
29.4.2013 10:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na Kit
Hartrik:9.5.2013 14:45

Rád bych ho viděl ;)
O reflexi toho ještě moc nevím, tak by se mi to celkem hodilo.

 
Odpovědět
9.5.2013 14:45
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Hartrik
Kit:9.5.2013 16:09

V podstatě jsem vyšel z tutoriálu na
http://docs.oracle.com/…difiers.html
ale celé jsem to překopal, aby to odpovídalo mým představám o OOP a pár věcí jsem přidal, abych vytahal i informace, které původní aplikace vytáhnout neumí.

BTW: Hlavně jsem vyhodil ten import static...

Editováno 9.5.2013 16:12
Odpovědět
9.5.2013 16:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na Kit
Hartrik:9.5.2013 18:19

No jo, už asi vím o co v té reflexi jde. Zrovna ty barvy jsem mohl použít v jednom mém programu, ale to jsem to ještě neznal...

 
Odpovědět
9.5.2013 18:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.