Ukážka reflexie v Jave
Jednoduchá ukážka práce s reflexiou. Táto ukážka vznikla úplne neúmyselne a náhodne. sczdavos chcel poradiť ako má dostať z triedy Color názvy definovaných farieb + ich hodnoty. Napísal som mu to a potom ten "Šupák" : D povedal že je to moc dlhý a nechcel by to vysvetľovať v ukážkovom programe pre Android a nakoniec si to napísal podľa seba. Tak aspon sem hodím kód ako ukážku.
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()); } } }
Galéria