Java Academy · Lekcja

Refleksja i konfiguracja

Obsługa funkcji dynamicznych

Lekcja 3 z 413 kroki

Refleksja i konfiguracja to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 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.

Refleksja i konfiguracja

Analiza zamkniętego świata narzędzia native-image widzi tylko kod, który może prześledzić statycznie. Funkcje dynamiczne — refleksja, proxy, zasoby i serializacja — ukrywają swoje cele przed analizatorem. W tej lekcji wyjaśniono, jak zapewnić ich działanie w natywnym pliku binarnym.

Problem z refleksją

Gdy wyszukują Państwo klasę na podstawie nazwy zapisanej w ciągu znaków, analizator nie może wiedzieć, o którą klasę chodzi. Jeśli taka klasa jest poza tym nieosiągalna, zostanie wykluczona z obrazu, a wyszukiwanie zakończy się błędem w czasie działania.

public class Main {
    public static void main(String[] args) throws Exception {
        String name = "java.util.ArrayList"; // could come from config
        Class<?> c = Class.forName(name);
        System.out.println("Loaded: " + c.getSimpleName());
    }
}

Metadane osiągalności

Rozwiązaniem są metadane osiągalności: pliki JSON informujące native-image, które klasy, metody i pola są używane dynamicznie. Podczas budowania zostają one zachowane, a ich składowe są rejestrowane.

reflect-config.json

Wpis dotyczący refleksji określa klasę oraz składowe, które należy zachować. Ten fragment jest zapisany w formacie JSON, a nie Java — znajduje się w katalogu META-INF/native-image/.

[
  {
    "name": "com.example.Person",
    "allDeclaredConstructors": true,
    "allDeclaredMethods": true,
    "fields": [ { "name": "age" } ]
  }
]

Agent śledzący

Ręczne tworzenie metadanych jest żmudne. Należy uruchomić aplikację na JVM z użyciem agenta śledzącego (-agentlib:native-image-agent=config-output-dir=...). Rejestruje on każdy dostęp dynamiczny podczas rzeczywistego uruchomienia i automatycznie generuje pliki konfiguracyjne.

Przetestuj ścieżki kodu

Agent rejestruje tylko to, co rzeczywiście zostanie wykonane, dlatego należy przeprowadzić aplikację przez wszystkie jej funkcje — uruchomić w niej testy. Każda pominięta ścieżka refleksyjna nie trafi do metadanych i spowoduje błąd podczas natywnego budowania.

Dynamiczne proxy

Dynamiczne proxy JDK wymagają pliku proxy-config.json zawierającego listę zestawów interfejsów, dla których tworzone są proxy. Analizator nie może wywnioskować tych informacji, ponieważ lista interfejsów jest tworzona w czasie działania.

Zasoby

Pliki wczytywane przez getResourceAsStream nie są automatycznie osadzane. Plik resource-config.json zawierający wzorce glob informuje native-image, które zasoby należy dołączyć do pliku wykonywalnego.

public class Main {
    public static void main(String[] args) {
        var url = Main.class.getResource("/banner.txt");
        System.out.println("Resource present: " + (url != null));
    }
}

Serializacja i JNI

Serializacja Javy i wywołania kodu natywnego (JNI) również są dynamiczne. Każdy z tych mechanizmów ma własny plik konfiguracyjny (serialization-config.json, jni-config.json). Agent śledzący generuje je również wtedy, gdy te ścieżki zostaną wykonane.

Rejestracja programowa

Autorzy bibliotek mogą rejestrować metadane w kodzie za pomocą Feature przez API RuntimeReflection, wykonywane w czasie budowania. Dzięki temu poprawna konfiguracja jest dostarczana wewnątrz biblioteki, więc użytkownicy nie muszą niczego konfigurować ręcznie.

Współdzielone repozytorium metadanych

GraalVM utrzymuje społecznościowe repozytorium metadanych osiągalności zawierające gotową konfigurację dla popularnych bibliotek. Narzędzia do natywnego budowania mogą pobierać ją automatycznie, dzięki czemu typowe frameworki działają od razu.

Szybki test

Proszę sprawdzić, czy rozumieją Państwo działanie funkcji dynamicznych w native image.

Podsumowanie

Nauczyli się Państwo obsługi funkcji dynamicznych:

  • Refleksja, proxy, zasoby, serializacja i JNI są niewidoczne dla analizy statycznej.
  • Metadane osiągalności w plikach JSON deklarują te elementy dla native-image.
  • Agent śledzący automatycznie generuje konfigurację na podstawie rzeczywistego uruchomienia JVM.
  • Należy przećwiczyć wszystkie ścieżki kodu, zwłaszcza testy, aby niczego nie pominąć.
  • W przypadku popularnych bibliotek należy korzystać ze współdzielonego repozytorium metadanych.
Bezpłatny start

Ucz się Java dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
104
Lekcje
374

Często zadawane pytania

Czy lekcja „Refleksja i konfiguracja” jest bezpłatna?

Tak — pełny tekst „Refleksja i konfiguracja” 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 „Refleksja i konfiguracja”?

Obsługa funkcji dynamicznych Ć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 3 z 4.

Ile czasu zajmuje lekcja „Refleksja i konfiguracja”?

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

  1. Czym jest GraalVM
  2. Budowanie obrazu natywnego
  3. Refleksja i konfiguracja
  4. Kompromisy obrazu natywnego
← Powrót do Java Academy