czwartek, 19 maja 2011

Refleksja w javie

Refleksja pozwala na traktowania kodu podobnie do zwykłych danych. Pozwala to na zmianę zachowania funkcji lub metod, które są już zdefiniowane, w trakcie działania. Ponadto umożliwia pozyskanie informacji o klasach podczas wykonywania programu. W przypadku javy, opartej o maszynę wirtualną jest to czesto spotykany mechanizm.

Przykład:

Poniższy kod wykonany bez refleksji:

Klasa klasa = new Klasa();
klasa.doSth();

W przykładzie tego kodu z refleksją, przeniesiemy nazwę klasy i metody do zmiennych, których wartość można ustalić w czasie wykonywania programu.

Class jeden = Class.forName("Klasa");
 Method refleks = jeden.getMethod("doSth", null);
 refleks.invoke(jeden.newInstance(), null);
Drugi przykład pokaże jak za pomocą refleksji można zdobyć 
przydatne informacje o klasie podczas wykonywania programu:
 
Trzeba pamiętać o zaimportowaniu 
java.lang.reflect.*;
public class Dwa {
    public String funkcja(Integer i) {
        return "Odliczam:" + i";
    }
}
 
import static java.lang.System.out;
import java.lang.reflect.*;
 
public class Main 
{
    public static void main(String[] args) throws Exception  
{
  String className = "Dwa";
  Class p = Class.forName(className);  //dla danej klasy
  Method[] b = p.getDeclaredMethods();  //pobiera nazwy metod
  for (int i=0;i<b.length;++i)           // dla liczby metod w danej klasie
{ 
 out.print("Klasa " + className + " ma metode '" + b[i].getName().toString() + "'");
 out.println(" ktora zwraca wartosc typu " + b[i].getReturnType().toString());
        }
    }
}

Brak komentarzy:

Prześlij komentarz