Czy ktoś może mi powiedzieć jakie zalety niesie ze sobą korzystanie z Reflection, bo ja jakoś nie jestem w stanie ich dostrzec.
Pozdrawiam.
w trakcie dzialania programu mozesz tworzyc instancje klas i wywolywac metody, ktorych nie znales w trakcie kompilacji.
pozdrawiam
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
@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.
Witam
Z tego co kojarzę jedynie używajac refleksji jestesmy w stanie stworzyć tablicę typów generycznych.
pzdr
A mozesz pokazac jak to zrobic?
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;
}
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.