Po co ten Reflection?

0

Czy ktoś może mi powiedzieć jakie zalety niesie ze sobą korzystanie z Reflection, bo ja jakoś nie jestem w stanie ich dostrzec.
Pozdrawiam.

0

w trakcie dzialania programu mozesz tworzyc instancje klas i wywolywac metody, ktorych nie znales w trakcie kompilacji.

pozdrawiam

0

w trakcie dzialania programu mozesz tworzyc instancje klas i wywolywac metody, ktorych nie znales w trakcie kompilacji.

A ma to jakieś praktyczne zastosowanie oprócz tego, że zmniejsza czytelność [???] Może moje pytania są głupie ale dopiero z C++ się przesiadam a tam niczego takiego nie było.
Pozdrawiam

0

@MWNN, w ten sposób np. tworzy sie połączenia do bazy danych:

Driver.forName("org.postgres.Driver");

Jednka największą zaletą reflection jest możliwość kontrolowania ruchu w klase i tak np.:

  • w pliku XML podajemy sobie nazwę klasy
  • następnie w programie możemy sprawdzić czy w kodzie są adnotacje.

Inny przykład. Mamy sobie program który wykorzystuje pewien interfejs I jednak implementacji tego interfejsu nie będziemy tworzyć ponieważ pozwolimy na to klientowi. Jednocześnie chcemy w pewnym miejscu skorzystać z tego interfejsu. Zróbmy więc sobie fabrykę która będzie zwracała na podstawie nazwy klasy obiekty:

public class SimpleFactory implements Factory{
    public I getIImplementationInstanceForName(String clazz){
        Reflection r = new Reflection();
	I i = null;			
	i = (I)Class.forName(clazz).newInstance();
	return i;
   }
}

W ten sposób przenieśliśmy informacje o tym jakie klasy sa wykorzystywane na zewnątrz do jakiegoś pliku konfiguracyjnego. Wymiana implementacji to tylko wymiana wpisu w configu :)
Oczywiście zostaje jeszcze cały JavaBean...

ps. przykład z fabryką to właśnie okrojony JavaBean z SpringFramework.

0

Witam

Z tego co kojarzę jedynie używajac refleksji jestesmy w stanie stworzyć tablicę typów generycznych.

pzdr

0

A mozesz pokazac jak to zrobic?

0

takiego potworka na necie znalazłem

public static <T> T[] toArray(Collection<T> c, Class<T> k) {
T[] a = (T[])java.lang.reflect.Array. // unchecked cast
newInstance(k, c.size());
int i=0; for (T x : c) a[i++] = x;
return a;
}

0

Bez reflection nie dałoby się stworzyć takich rzeczy jak mapowanie obiektowo relacyjne np. Hibernate albo kontener IoC jak Spring czy PicoContainer. Takie rozwiązania w C++ praktycznie nie mają bytu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1