Ukázka reflexe v Javě

Java Pro pokročilé Ukázka reflexe v Javě

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.

 

  Aktivity (2)

Program pro vás napsal Fugiczek
Avatar

Jak se ti líbí článek?
Celkem (1 hlasů) :
22 222


 


Miniatura
Všechny články v sekci
Java - Pro pokročilé
Miniatura
Následující článek
Unit testy v Javě a JUnit

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:

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:

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
Avatar
Kit
Redaktor
Avatar
Odpovídá na Hartrik
Kit:

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  +1 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:

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.