Inspekcja klas za pomocą refleksji
Pobieraj obiekty Class oraz badaj w czasie działania pola, metody, konstruktory i adnotacje.
Inspekcja klas za pomocą refleksji to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Czym jest refleksja?
Refleksja pozwala programowi w Javie sprawdzać i modyfikować własną strukturę w czasie działania — odczytywać nazwy klas, pól, metod, konstruktorów i adnotacji bez znajomości ich w czasie kompilacji.
Uzyskiwanie obiektu Class
Obiekt Class<?> można uzyskać za pomocą literału klasy, getClass() lub Class.forName().
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameSprawdzanie metadanych klasy
Z obiektu Class można pobrać nazwę klasy, pakiet, nadklasę oraz zaimplementowane interfejsy.
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());Wyświetlanie zadeklarowanych pól
getDeclaredFields() zwraca wszystkie pola zadeklarowane w klasie, w tym prywatne. getFields() zwraca wyłącznie pola publiczne, w tym odziedziczone.
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}Wyświetlanie metod
getDeclaredMethods() wyświetla wszystkie metody, niezależnie od poziomu dostępu. Do pobrania publicznych metod, w tym odziedziczonych, należy użyć getMethods().
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}Sprawdzanie parametrów metod
Należy pobrać typy i nazwy parametrów oraz ich adnotacje. Pobieranie nazw wymaga użycia flagi kompilatora -parameters.
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}Wyświetlanie konstruktorów
Konstruktory należy sprawdzać tak samo jak metody. getDeclaredConstructors() uwzględnia również prywatne konstruktory używane we wzorcach singleton lub builder.
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}Odczytywanie adnotacji
Można pobierać adnotacje z klasy, metody lub pola. Ich obecność należy sprawdzać za pomocą isAnnotationPresent, a wartość pobierać za pomocą getAnnotation.
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));Sprawdzanie modyfikatorów
Na modyfikatorach pól, metod lub klas należy używać metod Modifier.isPublic(), isStatic(), isFinal() i podobnych, aby filtrować elementy według widoczności.
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}Sprawdzanie za pomocą isAssignableFrom i instanceof
Należy użyć Class.isAssignableFrom(), aby programowo sprawdzić zgodność typów — jest to odpowiednik instanceof, ale z użyciem obiektów klas znanych dopiero w czasie działania.
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseUwaga dotycząca wydajności
Refleksja jest od 10 do 50 razy wolniejsza od bezpośredniego kodu przy prostym dostępie do pól i metod. Należy buforować obiekty Field i Method, wywoływać setAccessible(true) raz, a następnie wielokrotnie ich używać.
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}Szybkie sprawdzenie
Która metoda zwraca prywatne pola klasy, ale nie pola odziedziczone?
Podsumowanie
Obiekt Class można uzyskać za pomocą literałów lub forName(). Do sprawdzania wszystkich elementów, niezależnie od poziomu dostępu, należy używać getDeclaredFields/Methods/Constructors. Adnotacje można odczytywać za pomocą getAnnotation. Aby zwiększyć wydajność, należy buforować obiekty refleksyjne.
Często zadawane pytania
Czy lekcja „Inspekcja klas za pomocą refleksji” jest bezpłatna?
Tak — pełny tekst „Inspekcja klas za pomocą refleksji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Inspekcja klas za pomocą refleksji”?
Pobieraj obiekty Class oraz badaj w czasie działania pola, metody, konstruktory i adnotacje. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Inspekcja klas za pomocą refleksji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Inspekcja klas za pomocą refleksji
- Wywoływanie metod i uzyskiwanie dostępu do pól
- Dynamiczne proxy z InvocationHandler
- Wydajność refleksji i alternatywy