Klasseinspeksjon med refleksjon
Hent Class-objekter, og undersøk felt, metoder, konstruktører og annotasjoner under kjøring.
Klasseinspeksjon med refleksjon er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva er refleksjon?
Refleksjon gjør det mulig for et Java-program å undersøke og endre sin egen struktur under kjøring – lese klassenavn, felt, metoder, konstruktører og annotasjoner uten å kjenne dem ved kompilering.
Hente et Class-objekt
Hent et Class<?>-objekt via en literal, getClass() eller Class.forName().
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameUndersøke klassens metadata
Hent klassenavn, pakke, superklasse og implementerte grensesnitt fra Class-objektet.
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());Liste opp deklarerte felt
getDeclaredFields() returnerer alle felt som er deklarert i klassen, inkludert private felt. getFields() returnerer bare offentlige felt, inkludert nedarvede felt.
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}Liste opp metoder
getDeclaredMethods() lister opp alle metoder, uavhengig av tilgangsnivå. Bruk getMethods() for offentlige metoder, inkludert nedarvede metoder.
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}Undersøke metodeparametere
Hent parametertyper, navn (krever kompilatorflagget -parameters) og annotasjoner.
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}Liste opp konstruktører
Undersøk konstruktører på samme måte som metoder. getDeclaredConstructors() inkluderer private konstruktører som brukes i singletoner eller builders.
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}Lese annotasjoner
Hent annotasjoner på klassen, metoden eller feltet. Kontroller om en annotasjon finnes med isAnnotationPresent, og hent verdien med 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()));Kontrollere modifikatorer
Bruk Modifier.isPublic(), isStatic(), isFinal() og så videre på modifikatorene til felt, metoder og klasser for å filtrere etter synlighet.
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}isAssignableFrom- og instanceof-kontroll
Bruk Class.isAssignableFrom() til å kontrollere typekompatibilitet programmatisk – tilsvarende instanceof, men med klasseobjekter som først er kjent under kjøring.
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseYtelsesforbehold
Refleksjon er 10–50× tregere enn direkte kode ved enkel tilgang til felt og metoder. Bufre Field- og Method-objekter, kall setAccessible(true) én gang og bruk dem på nytt.
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); }
}Hurtigsjekk
Hvilken metode returnerer private felt i en klasse, men ikke nedarvede felt?
Oppsummering
Hent Class via literaler eller forName(). Bruk getDeclaredFields/Methods/Constructors for inspeksjon på alle tilgangsnivåer. Les annotasjoner med getAnnotation. Bufre refleksjonsobjekter for bedre ytelse.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Klasseinspeksjon med refleksjon» gratis?
Ja – hele teksten i «Klasseinspeksjon med refleksjon» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Klasseinspeksjon med refleksjon»?
Hent Class-objekter, og undersøk felt, metoder, konstruktører og annotasjoner under kjøring. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Klasseinspeksjon med refleksjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Klasseinspeksjon med refleksjon
- Kalle metoder og få tilgang til felt
- Dynamiske proxyer med InvocationHandler
- Refleksjonsytelse og alternativer