Sprievodca reflexiou Java

1. Prehľad

V tomto článku sa budeme zaoberať reflexiou Javy, ktorá nám umožňuje kontrolovať alebo upravovať runtime atribúty tried, rozhraní, polí a metód. To sa zvlášť hodí, keď ich kompilácie nepoznáme.

Ďalej môžeme pomocou inštancie vytvoriť inštanciu nových objektov, vyvolať metódy a získať alebo nastaviť hodnoty poľa.

2. Nastavenie projektu

Aby sme mohli používať odraz Java, nemusíme obsahovať žiadne špeciálne nádoby, akákoľvek špeciálna konfigurácia alebo závislosti Maven. JDK sa dodáva so skupinou tried, ktoré sú súčasťou java.lang.reflect balíček špeciálne na tento účel.

Všetko, čo musíme urobiť, je vykonať nasledujúci import do nášho kódu:

import java.lang.reflect. *;

a môžeme ísť.

Pre získanie prístupu k informáciám o triede, metóde a poli inštancie hovoríme getClass metóda, ktorá vráti reprezentáciu objektu za behu triedy. Vrátený trieda objekt poskytuje metódy na prístup k informáciám o triede.

3. Jednoduchý príklad

Aby sme si namočili nohy, ideme sa pozrieť na veľmi základný príklad, ktorý za behu kontroluje polia jednoduchého Java objektu.

Vytvorme jednoduchý Osoba trieda s iba názov a Vek polia a vôbec žiadne metódy. Tu je trieda Osoba:

public class Osoba {private String name; súkromný int vek; }

Teraz pomocou odrazu v jazyku Java objavíme názvy všetkých polí tejto triedy. Aby sme ocenili silu odrazu, zostrojíme a Osoba objekt a ako referenčný typ použite Object:

@Test public void givenObject_whenGetsFieldNamesAtRuntime_thenCorrect () {Objekt osoba = nová Osoba (); Pole [] fields = person.getClass (). GetDeclaredFields (); Zoznam skutočných mien polí = getFieldNames (polia); assertTrue (Arrays.asList ("name", "age") .containsAll (actualFieldNames)); }

Tento test nám ukazuje, že sme schopní získať pole Fpole predmety z našej osoba objekt, aj keď je odkaz na objekt nadradeným typom tohto objektu.

V uvedenom príklade nás zaujímali iba názvy týchto polí, ale dá sa urobiť oveľa viac a ďalšie príklady toho uvidíme v ďalších častiach.

Všimnite si, ako používame pomocnú metódu na extrahovanie skutočných názvov polí, je to veľmi základný kód:

private static List getFieldNames (Field [] fields) {List fieldNames = new ArrayList (); pre (Field field: fields) fieldNames.add (field.getName ()); návratové názvy polí; }

4. Prípady použitia Java Reflection

Predtým, ako pristúpime k rôznym vlastnostiam reflexie Java, prediskutujeme niektoré bežné spôsoby použitia, ktoré pre ňu môžeme nájsť. Reflexia jazyka Java je mimoriadne silná a môže sa vám hodiť mnohými spôsobmi.

Napríklad v mnohých prípadoch máme pre databázové tabuľky konvenciu pomenovania. Môžeme sa rozhodnúť pridať konzistenciu predbežným opravením názvov tabuliek pomocou tbl_, takže sa volá tabuľka s údajmi o študentoch tbl_student_data.

V takýchto prípadoch môžeme objekt Java, ktorý obsahuje údaje študentov, pomenovať ako Študent alebo StudentData. Potom pomocou paradigmy CRUD máme pre každú takúto operáciu jeden vstupný bod Vytvoriť operácie dostávajú iba Objekt parameter.

Potom pomocou reflexie načítame názov objektu a názvy polí. V tomto okamihu môžeme tieto údaje namapovať na tabuľku DB a priradiť hodnoty poľa objektu k príslušným názvom polí DB.

5. Kontrola tried Java

V tejto časti preskúmame najzákladnejšiu súčasť rozhrania Java reflect API. Objekty triedy Java, ako sme už spomenuli, nám umožňujú prístup k vnútorným detailom ľubovoľného objektu.

Budeme skúmať interné podrobnosti, ako napríklad názov triedy objektu, modifikátory, polia, metódy, implementované rozhrania atď.

5.1. Pripravovať sa

Aby sme pevne pochopili reflexné API, ako je aplikované na triedy Java, a aby sme mali rozmanité príklady, vytvoríme abstrakt Zviera trieda, ktorá implementuje Stravovanie rozhranie. Toto rozhranie definuje stravovacie správanie každého betónu Zviera objekt, ktorý tvoríme.

Takže po prvé, tu je Stravovanie rozhranie:

verejné rozhranie Stravovanie {String eats (); }

a potom betón Zviera implementácia Stravovanie rozhranie:

verejná abstraktná trieda Zvieracie náradie Stravovanie {public static String CATEGORY = "domáci"; súkromné ​​meno reťazca; chránený abstrakt String getSound (); // vynechaný konštruktor, štandardné getre a setre}

Vytvorme tiež ďalšie rozhranie s názvom Lokomotíva ktorý popisuje, ako sa zviera pohybuje:

verejné rozhranie Locomotion {String getLocomotion (); }

Teraz vytvoríme konkrétnu triedu s názvom Koza ktorý sa rozširuje Zviera a náradie Lokomotíva. Pretože nadtrieda implementuje Stravovanie, Koza bude musieť implementovať aj metódy tohto rozhrania:

verejná trieda Koza sa rozširuje Zvieracie náradie Locomotion {@Override chránené String getSound () {return "bleat"; } @Override public String getLocomotion () {návrat "prechádzky"; } @Override public String eats () {return "tráva"; } // vynechaný konštruktor}

Od tohto okamihu budeme pomocou reflexie Java kontrolovať aspekty objektov Java, ktoré sa objavujú vo vyššie uvedených triedach a rozhraniach.

5.2. Názvy tried

Začnime tým, že dostaneme názov objektu z Trieda:

@Test public void givenObject_whenGetsClassName_thenCorrect () {Objekt koza = nová Koza ("koza"); Trieda clazz = goat.getClass (); assertEquals ("Koza", clazz.getSimpleName ()); assertEquals ("com.baeldung.reflection.Goat", clazz.getName ()); assertEquals ("com.baeldung.reflection.Goat", clazz.getCanonicalName ()); }

Všimnite si, že getSimpleName metóda Trieda vráti základný názov objektu, ako by sa javil v jeho vyhlásení. Potom ďalšie dve metódy vrátia úplný názov triedy vrátane deklarácie balíka.

Pozrime sa tiež, ako môžeme vytvoriť objekt objektu Koza triedy, ak poznáme iba jej plne kvalifikovaný názov triedy:

@Test public void givenClassName_whenCreatesObject_thenCorrect () {Class clazz = Class.forName ("com.baeldung.reflection.Goat"); assertEquals ("Koza", clazz.getSimpleName ()); assertEquals ("com.baeldung.reflection.Goat", clazz.getName ()); assertEquals ("com.baeldung.reflection.Goat", clazz.getCanonicalName ()); }

Všimnite si, že meno, ktoré odovzdáme statickému preMeno metóda by mala obsahovať informácie o balíku. V opačnom prípade dostaneme a ClassNotFoundException.

5.3. Modifikátory triedy

Modifikátory použité v triede môžeme určiť zavolaním getModifikátory metóda, ktorá vracia Celé číslo. Každý modifikátor je príznakový bit, ktorý je nastavený alebo vymazaný.

The java.lang.reflect.Modifikátor trieda ponúka statické metódy, ktoré analyzujú vrátené Celé číslo za prítomnosť alebo neprítomnosť konkrétneho modifikátora.

Poďme potvrdiť modifikátory niektorých z tried, ktoré sme definovali vyššie:

@Test public void givenClass_whenRecognisesModifiers_thenCorrect () {Class goatClass = Class.forName ("com.baeldung.reflection.Goat"); Class animalClass = Class.forName ("com.baeldung.reflection.Animal"); int goatMods = goatClass.getModifiers (); int animalMods = animalClass.getModifiers (); assertTrue (Modifier.isPublic (goatMods)); assertTrue (Modifier.isAbstract (animalMods)); assertTrue (Modifier.isPublic (animalMods)); }

Sme schopní skontrolovať modifikátory akejkoľvek triedy umiestnené v banke knižnice, ktoré importujeme do nášho projektu.

Vo väčšine prípadov možno budeme musieť použiť preMeno skôr ako plnohodnotná inštancia, pretože to by bol nákladný proces v prípade tried náročných na pamäť.

5.4. Informácie o balíku

Použitím reflexie Java sme tiež schopní získať informácie o balíku akejkoľvek triedy alebo objektu. Tieto údaje sú zhromaždené vo vnútri servera Balíček triedy, ktorá je vrátená volaním na getPackage metóda na objekte triedy.

Spustime test na získanie názvu balíka:

@Test public void givenClass_whenGetsPackageInfo_thenCorrect () {koza koza = nová koza ("koza"); Trieda goatClass = goat.getClass (); Balík pkg = goatClass.getPackage (); assertEquals ("com.baeldung.reflection", pkg.getName ()); }

5.5. Super trieda

Sme tiež schopní získať nadtriedu akejkoľvek triedy Java pomocou odrazu Java.

V mnohých prípadoch, najmä keď používame triedy knižnice alebo integrované triedy Java, možno nebudeme vedieť vopred nadtriedu objektu, ktorý používame, bude v tejto podsekcii uvedené, ako tieto informácie získať.

Poďme teda do toho a určme nadtriedu Koza. Dodatočne to tiež ukazujeme java.lang.String trieda je podtrieda java.lang.Objekt trieda:

@Test public void givenClass_whenGetsSuperClass_thenCorrect () {koza koza = nová koza ("koza"); Reťazec str = "ľubovoľný reťazec"; Trieda goatClass = goat.getClass (); Trieda goatSuperClass = goatClass.getSuperclass (); assertEquals ("Zviera", goatSuperClass.getSimpleName ()); assertEquals ("Objekt", str.getClass (). getSuperclass (). getSimpleName ()); }

5.6. Implementované rozhrania

Pomocou Java reflexie sme tiež schopní získať zoznam rozhraní implementovaných danou triedou.

Načítajme typy tried rozhraní implementovaných pomocou Koza triedy a Zviera abstraktná trieda:

@Test public void givenClass_whenGetsImplementedInterfaces_thenCorrect () {Class goatClass = Class.forName ("com.baeldung.reflection.Goat"); Class animalClass = Class.forName ("com.baeldung.reflection.Animal"); Trieda [] goatInterfaces = goatClass.getInterfaces (); Trieda [] animalInterfaces = animalClass.getInterfaces (); assertEquals (1, goatInterfaces.length); assertEquals (1, animalInterfaces.length); assertEquals ("Locomotion", goatInterfaces [0] .getSimpleName ()); assertEquals ("Stravovanie", animalInterfaces [0] .getSimpleName ()); }

Všimnite si z tvrdení, že každá trieda implementuje iba jedno rozhranie. Pri kontrole názvov týchto rozhraní to zistíme Koza náradie Lokomotíva a Zviera náradie Stravovanie, ako je uvedené v našom kóde.

Možno ste to pozorovali Koza je podtrieda abstraktnej triedy Zviera a implementuje metódu rozhrania jej ()potom Koza tiež implementuje Stravovanie rozhranie.

Preto stojí za zmienku, že iba tie rozhrania, ktoré trieda výslovne deklaruje ako implementované s náradie kľúčové slovo sa objaví vo vrátenom poli.

Takže aj keď trieda implementuje metódy rozhrania, pretože jej nadtrieda toto rozhranie implementuje, ale podtrieda priamo nedeklaruje dané rozhranie s náradie kľúčové slovo, potom sa dané rozhranie v poli rozhraní neobjaví.

5.7. Konštruktéri, metódy a polia

Vďaka Java reflexii sme schopní skontrolovať konštruktory akejkoľvek triedy objektov, ako aj metódy a polia.

Neskôr uvidíme hlbšie kontroly každej z týchto zložiek triedy, zatiaľ však stačí iba získať ich názvy a porovnať ich s tým, čo očakávame.

Pozrime sa, ako získať konštruktora súboru Koza trieda:

@Test public void givenClass_whenGetsConstructor_thenCorrect () {Class goatClass = Class.forName ("com.baeldung.reflection.Goat"); Konštruktor [] konštruktory = goatClass.getConstructors (); assertEquals (1, constructors.length); assertEquals ("com.baeldung.reflection.Goat", konštruktory [0] .getName ()); }

Môžeme tiež skontrolovať polia Zviera trieda takto:

@Test public void givenClass_whenGetsFields_thenCorrect () {Class animalClass = Class.forName ("com.baeldung.reflection.Animal"); Field [] fields = animalClass.getDeclaredFields (); Zoznam skutočných polí = getFieldNames (polia); assertEquals (2, actualFields.size ()); assertTrue (actualFields.containsAll (Arrays.asList ("name", "CATEGORY"))); }

Rovnako ako môžeme skontrolovať metódy Zviera trieda:

@Test public void givenClass_whenGetsMethods_thenCorrect () {Class animalClass = Class.forName ("com.baeldung.reflection.Animal"); Metóda [] methods = animalClass.getDeclaredMethods (); Zoznam actualMethods = getMethodNames (metódy); assertEquals (4, actualMethods.size ()); assertTrue (actualMethods.containsAll (Arrays.asList ("getName", "setName", "getSound"))); }

Rovnako ako getFieldNames, pridali sme pomocnú metódu na získanie názvov metód z poľa Metóda objekty:

private static List getMethodNames (Method [] methods) {List methodNames = new ArrayList (); pre (Metóda metóda: metódy) methodNames.add (method.getName ()); návratová metóda Názvy; }

6. Kontrola konštruktérov

Vďaka Java reflexii môžeme kontrolovať konštruktérov akejkoľvek triedy a dokonca vytvárať objekty triedy za behu. To umožňuje java.lang.reflect.Constructor trieda.

Predtým sme sa iba pozerali na to, ako získať pole Konštruktér objekty, z ktorých sa nám podarilo získať mená konštruktérov.

V tejto časti sa zameriame na to, ako načítať konkrétne konštruktory. Ako vieme v Jave, žiadny z dvoch konštruktorov triedy nezdieľa presne ten istý podpis metódy. Túto jedinečnosť teda využijeme na získanie jedného konštruktora z mnohých.

Aby sme ocenili vlastnosti tejto triedy, vytvoríme Vták podtrieda Zviera s tromi konštruktérmi. Nebudeme realizovať Lokomotíva aby sme mohli toto správanie určiť pomocou argumentu konštruktora, aby sme pridali ešte väčšiu rozmanitosť:

verejná trieda Bird rozširuje Animal {súkromné ​​booleovské prechádzky; public Bird () {super ("vták"); } public Bird (Názov reťazca, booleovské prechádzky) {super (meno); setWalks (prechádzky); } public Bird (Názov reťazca) {super (meno); } public boolean vychádzky () {spätné prechádzky; } // štandardní nastavovatelia a prepísané metódy}

Potvrďme pomocou reflexie, že táto trieda má tri konštruktory:

@Test public void givenClass_whenGetsAllConstructors_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Konštruktor [] konštruktory = birdClass.getConstructors (); assertEquals (3, constructors.length); }

Ďalej získame každého konštruktora pre Vták triedy odovzdaním typov tried parametrov konštruktora v deklarovanom poradí:

@Test public void givenClass_whenGetsEachConstructorByParamTypes_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Konštruktor cons1 = birdClass.getConstructor (); Konštruktor cons2 = birdClass.getConstructor (String.class); Konštruktor cons3 = birdClass.getConstructor (String.class, boolean.class); }

Nie je potrebné tvrdenie, pretože keď neexistuje konštruktor s danými typmi parametrov v danom poradí, dostaneme NoSuchMethodException a test automaticky zlyhá.

V poslednom teste uvidíme, ako vytvoriť inštanciu objektov za behu pri zadávaní ich parametrov:

@Test public void givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Konštruktor cons1 = birdClass.getConstructor (); Konštruktor cons2 = birdClass.getConstructor (String.class); Konštruktor cons3 = birdClass.getConstructor (String.class, boolean.class); Bird bird1 = (Bird) cons1.newInstance (); Bird bird2 = (Bird) cons2.newInstance ("Weaver bird"); Bird bird3 = (Bird) cons3.newInstance („holubica“, pravda); assertEquals ("vták", bird1.getName ()); assertEquals ("Weaver bird", bird2.getName ()); assertEquals ("holubica", bird3.getName ()); assertFalse (bird1.walks ()); assertTrue (bird3.walks ()); }

Vytvoríme inštancie objektov triedy volaním súboru novýInštancia metóda Konštruktér triedy a odovzdanie požadovaných parametrov v deklarovanom poradí. Výsledok potom prihodíme požadovanému typu.

Je tiež možné zavolať predvolený konštruktor pomocou Class.newInstance () metóda. Táto metóda je však od verzie Java 9 zastaraná a nemali by sme ju používať v moderných projektoch Java.

Pre vták1, použijeme predvolený konštruktor, ktorý z nášho Vták kód, automaticky nastaví meno na vtáka a my to potvrdíme testom.

Potom urobíme inštanciu vták2 iba s menom a testom, nezabudnite, že keď nenastavíme lokomočné správanie, ktoré je predvolene falošné, ako je vidieť v posledných dvoch tvrdeniach.

7. Kontrola polí

Predtým sme kontrolovali iba názvy polí, v tejto časti sme ukážeme akozískať a nastaviť ich hodnoty za behu.

Na kontrolu polí triedy za behu sa používajú dve hlavné metódy: getFields () a getField (poleName).

The getFields () metóda vráti všetky dostupné verejné polia príslušnej triedy. Vráti všetky verejné polia v triede aj vo všetkých nadtriedach.

Napríklad, keď túto metódu voláme na Vták triedy, dostaneme iba KATEGÓRIA pole svojej nadtriedy, Zviera, od Vták sám nedeklaruje žiadne verejné polia:

@Test public void givenClass_whenGetsPublicFields_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Pole [] fields = birdClass.getFields (); assertEquals (1, pole.dĺžka); assertEquals ("CATEGORY", polia [0] .getName ()); }

Táto metóda má aj variant s názvom getField ktorý vráti iba jeden Lúka objekt prevzatím názvu poľa:

@Test public void givenClass_whenGetsPublicFieldByName_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Field field = birdClass.getField ("CATEGORY"); assertEquals ("CATEGORY", field.getName ()); }

Nie sme schopní získať prístup k súkromným poliam deklarovaným v nadtriedach a nedeklarovaným v podradenej triede. To je dôvod, prečo nemáme prístup k názov lúka.

Môžeme však skontrolovať súkromné ​​polia deklarované v triede, s ktorou máme do činenia, zavolaním na getDeclaredFields metóda:

@Test public void givenClass_whenGetsDeclaredFields_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Field [] fields = birdClass.getDeclaredFields (); assertEquals (1, pole.dĺžka); assertEquals ("prechádzky", polia [0] .getName ()); }

Môžeme použiť aj jeho ďalší variant, ak poznáme názov poľa:

@Test public void givenClass_whenGetsFieldsByName_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Field field = birdClass.getDeclaredField ("prechádzky"); assertEquals ("prechádzky", field.getName ()); }

Ak dostaneme nesprávny názov poľa alebo napíšeme do neexistujúceho poľa, dostaneme a NoSuchFieldException.

Typ poľa dostaneme nasledovne:

@Test public void givenClassField_whenGetsType_thenCorrect () {Field field = Class.forName ("com.baeldung.reflection.Bird") .getDeclaredField ("procházky"); Trieda fieldClass = field.getType (); assertEquals ("boolean", fieldClass.getSimpleName ()); }

Ďalej sa pozrieme na to, ako pristupovať k hodnotám polí a meniť ich. Aby sme mohli získať hodnotu poľa, nehovoriac o jeho nastavení, musíme najskôr nastaviť, aby bolo pole prístupné volaním setAccessible metóda na Lúka objekt a odovzdať boolean pravda k tomu:

@Test public void givenClassField_whenSetsAndGetsValue_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Bird bird = (Bird) birdClass.getConstructor (). NewInstance (); Field field = birdClass.getDeclaredField ("prechádzky"); field.setAccessible (true); assertFalse (field.getBoolean (vták)); assertFalse (bird.walks ()); pole.set (vtak, pravda); assertTrue (field.getBoolean (vták)); assertTrue (bird.walks ()); }

Vo vyššie uvedenom teste zisťujeme, že skutočne hodnota prechádzky pole je pred nastavením na true nepravdivé.

Všimnite si, ako používame Lúka objekt na nastavenie a získanie hodnôt odovzdaním inštancie triedy, s ktorou máme do činenia, a prípadne novej hodnoty, ktorú chceme, aby pole malo v danom objekte.

Je potrebné si uvedomiť jednu dôležitú vec Lúka objektov je, že keď je deklarovaný ako verejná statická, potom nepotrebujeme inštanciu triedy, ktorá ich obsahuje, stačí prejsť nulový na svojom mieste a stále získa predvolenú hodnotu poľa, napríklad takto:

@Test public void givenClassField_whenGetsAndSetsWithNull_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Field field = birdClass.getField ("CATEGORY"); field.setAccessible (true); assertEquals ("domáci", field.get (null)); }

8. Metódy kontroly

V predchádzajúcom príklade sme použili odraz iba na kontrolu názvov metód. Odraz Java je však oveľa silnejší.

Vďaka Java reflexii môžeme vyvolať metódy na beh programu a odovzdať im požadované parametre, rovnako ako sme to urobili pre konštruktérov. Podobne môžeme tiež vyvolať preťažené metódy zadaním typov parametrov každého z nich.

Rovnako ako polia, aj tu máme dve hlavné metódy, ktoré používame na načítanie metód triedy. The getMethods metóda vráti pole všetkých verejných metód triedy a nadtried.

To znamená, že s touto metódou môžeme získať verejné metódy java.lang.Objekt trieda ako natiahnuť, hashCodea notifyAll:

@Test public void givenClass_whenGetsAllPublicMethods_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Metóda [] methods = birdClass.getMethods (); Zoznam methodNames = getMethodNames (metódy); assertTrue (methodNames.containsAll (Arrays .asList ("equals", "notifyAll", "hashCode", "pochôdzky", "jesť", "toString"))); }

Aby sme dostali iba verejné metódy triedy, o ktorú sa zaujímame, musíme použiť getDeclaredMethods metóda:

@Test public void givenClass_whenGetsOnlyDeclaredMethods_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Zoznam actualMethodNames = getMethodNames (birdClass.getDeclaredMethods ()); Zoznam expectMethodNames = Polia .asList ("setWalks", "prechádzky", "getSound", "jesť"); assertEquals (expectMethodNames.size (), actualMethodNames.size ()); assertTrue (expectMethodNames.containsAll (actualMethodNames)); assertTrue (actualMethodNames.containsAll (expectMethodNames)); }

Každá z týchto metód má singulárnu variáciu, ktorá vracia jednu Metóda objekt, ktorého meno poznáme:

@ Test public void givenMethodName_whenGetsMethod_thenCorrect () vyvolá výnimku {Bird bird = new Bird (); Metóda procházkyMetód = bird.getClass (). GetDeclaredMethod ("prechádzky"); Metóda setWalksMethod = bird.getClass (). GetDeclaredMethod ("setWalks", boolean.class); assertTrue (WalkMethod.canAccess (vták)); assertTrue (setWalksMethod.canAccess (vták)); }

Všimnite si, ako načítame jednotlivé metódy a určíme, aké typy parametrov berú. Tie, ktoré neberú typy parametrov, sa načítajú s prázdnym argumentom premennej, takže nám zostáva iba jediný argument, názov metódy.

Ďalej si ukážeme, ako vyvolať metódu za behu programu. Štandardne vieme, že prechádzky atribút Vták trieda je nepravdivé, chceme to nazvať setWalks metóda a nastavte ju na pravda:

@Test public void givenMethod_whenInvokes_thenCorrect () {Class birdClass = Class.forName ("com.baeldung.reflection.Bird"); Bird bird = (Bird) birdClass.getConstructor (). NewInstance (); Metóda setWalksMethod = birdClass.getDeclaredMethod ("setWalks", boolean.class); Metóda procházkyMetóda = birdClass.getDeclaredMethod ("prechádzky"); booleovské prechádzky = (booleovské) procházkyMethod.invoke (vták); assertFalse (prechádzky); assertFalse (bird.walks ()); setWalksMethod.invoke (vták, pravda); boolean Walk2 = (boolean) WalkMethod.invoke (vták); assertTrue (prechádzky2); assertTrue (bird.walks ()); }

Všimnite si, ako najskôr vyvoláme prechádzky metóda a vrhnúť návratový typ na vhodný dátový typ a potom skontrolovať jeho hodnotu. Potom sa neskôr dovoláme setWalks metódu na zmenu tejto hodnoty a test znova.

9. Záver

V tomto tutoriáli sme sa venovali rozhraniu Java Reflection API a pozreli sme sa na to, ako ho používať na kontrolu tried, rozhraní, polí a metód za behu bez predchádzajúcej znalosti ich vnútorných častí v čase kompilácie.

Celý zdrojový kód a príklady tohto tutoriálu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found