W programowaniu Java, refleksja i introspekcja to dwa mechanizmy używane do uzyskiwania informacji o klasach, obiektach i członkach w trakcie działania programu. Chociaż oba terminy mogą brzmieć podobnie, służą różnym celom i są używane w różnych kontekstach.
Refleksja
Refleksja to mechanizm w Javie, który pozwala na badanie lub modyfikację struktury i zachowania programu w czasie wykonywania. Umożliwia to między innymi tworzenie nowych instancji klas, pobieranie informacji o polach, metodach oraz konstruktorach, a także wywoływanie metod i dostęp do pól niezależnie od ich specyfikatorów dostępu.
Introspekcja
Introspekcja to proces używany głównie w kontekście JavaBeans, do odkrywania “właściwości” (properties), zdarzeń i metod obsługujących zdarzenia obiektu. Jest bardziej ograniczona niż refleksja i korzysta z refleksji wewnętrznie. Introspekcja jest używana przez narzędzia, które automatycznie generują interfejs użytkownika, binding danych itp.
Przykład kodu w Java
Poniżej przedstawiam przykład, który demonstruje zarówno refleksję jak i introspekcję:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class ReflectionIntrospectionExample {
public static void main(String[] args) {
Person person = new Person("Jan", 30);
// Użycie refleksji do wyświetlenia nazw pól klasy
Field[] fields = person.getClass().getDeclaredFields();
System.out.println("Refleksja - Pola klasy:");
for (Field field : fields) {
System.out.println("Pole: " + field.getName()); // Wyświetla nazwę pola
}
// Użycie refleksji do wywołania metody
try {
Method method = person.getClass().getMethod("getName");
System.out.println("Refleksja - Wywołanie metody getName: "
+ method.invoke(person)); // Wywołuje metodę getName
} catch (Exception e) {
e.printStackTrace();
}
// Użycie introspekcji do wyświetlenia właściwości obiektu
try {
System.out.println("Introspekcja - Właściwości klasy:");
PropertyDescriptor[] propertyDescriptors =
Introspector.getBeanInfo(Person.class).getPropertyDescriptors();
for (PropertyDescriptor pd : propertyDescriptors) {
System.out.println("Właściwość: " + pd.getName()); // Wyświetla nazwę właściwości
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
private String name; // Nazwa użytkownika
private int age; // Wiek użytkownika
public Person(String name, int age) {
this.name = name; // Inicjalizacja nazwy
this.age = age; // Inicjalizacja wieku
}
// Getter dla name
public String getName() {
return name;
}
// Getter dla age
public int getAge() {
return age;
}
}
Podsumowanie
Refleksja i introspekcja w Javie umożliwiają programistom dynamiczne interakcje z kodem. Refleksja jest potężnym narzędziem, które pozwala na dynamiczną manipulację i inspekcję obiektów, podczas gdy introspekcja jest bardziej ograniczona i zwykle używana w kontekście JavaBeans.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.