Java Reflection jest dość potężny i może być bardzo przydatny. Java Reflection umożliwia sprawdzanie klas, interfejsów, pól i metod w czasie wykonywania, bez znajomości nazw klas, metod itp. W czasie kompilacji. Możliwe jest także tworzenie instancji nowych obiektów, wywoływanie metod i pobieranie / ustawianie wartości pól za pomocą odbicia.
Szybki przykład Java Reflection pokazujący, jak wygląda użycie odbicia:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Ten przykład uzyskuje obiekt Class z klasy o nazwie MyObject. Korzystając z obiektu klasy, przykład otrzymuje listę metod w tej klasie, iteruje metody i wypisuje ich nazwy.
Dokładnie wyjaśniono, jak to wszystko działa
Edycja : Po prawie 1 roku edytuję tę odpowiedź, ponieważ podczas czytania o refleksji mam jeszcze kilka zastosowań Refleksji.
- Wiosna używa konfiguracji fasoli, takiej jak:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Kiedy kontekst Spring przetwarza ten element <bean>, użyje Class.forName (String) z argumentem „com.example.Foo”, aby utworzyć instancję tej klasy.
Następnie ponownie użyje refleksji, aby uzyskać odpowiedni setter dla elementu <property> i ustawić jego wartość na określoną wartość.
- Junit używa Reflection szczególnie do testowania metod prywatnych / chronionych.
W przypadku metod prywatnych
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
W przypadku pól prywatnych
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);