Jegyzetparaméterek módosítása futás közben
1. Áttekintés
Megjegyzések , a metaadatok olyan formája, amelyet hozzáadhat a Java kódhoz. Ezek annotációk fordításkor feldolgozható és osztályfájlokba ágyazható, vagy futás közben megtartható és elérhető Visszaverődés .
Ebben a cikkben megvitatjuk a változtatás módját annotáció érték futás közben a Visszaverődés. Ebben a példában osztályszintű kommentárokat fogunk használni.
2. Megjegyzés
A Java lehetővé teszi új létrehozását annotációk a meglévők felhasználásával. A legegyszerűbb formában egy kommentár a következőképpen jelenik meg @ szimbólum, amelyet a kommentár neve követ:
@ Felülírás
Készítsük el saját annotációnkat Üdvözlő:
@Retention (RetentionPolicy.RUNTIME) public @interface Greeter {public String greet () default ""; }
Most létrehozunk egy Java osztályt Üdvözlet amely az osztályszintet használja annotáció :
@Greeter (üdvözlet = "Jó reggelt") nyilvános óra Üdvözlet {}
Most reflexióval fogunk hozzáférni a kommentár értékéhez. Java osztály Osztály módszert nyújt getAnnotation egy osztály kommentárjainak eléréséhez:
Üdvözlő üdvözlet = Greetings.class.getAnnotation (Greeter.class); System.out.println ("Üdvözlet!" + Üdvözlet.greet () + "!!");
3. Megjegyzés módosítása
Java osztály Osztály térképet vezet a kommentárok kezeléséhez - Megjegyzés osztály kulcsként és Megjegyzés objektum értékként:
Térkép térkép;
Frissíteni fogjuk ezt a térképet a futás közbeni annotáció megváltoztatásához. A térkép elérésének megközelítése különbözik a JDK különböző megvalósításaiban. Megbeszéljük a JDK7 és a JDK8 esetében.
3.1.JDK 7 végrehajtása
Java osztály Osztály mezője van annotációk. Mivel ez egy privát mező, ahhoz, hogy hozzáférjünk hozzá, a mező akadálymentesítését kell beállítanunk igaz. A Java biztosítja a módszert getDeclaredField bármely mező elérése a neve alapján:
A mező kommentárjai = Class.class.getDeclaredField (ANNOTATIONS); annotations.setAccessible (true);
Most hozzáférjünk az osztály kommentár térképéhez Üdvözlő:
Térkép map = annotations.get (targetClass);
Ez az a térkép, amely információkat tartalmaz az összes kommentárról és azok értékobjektumáról. Meg akarjuk változtatni Üdvözlő kommentár értéke, amelyet a (z) annotációs objektumának frissítésével érhetünk el Üdvözlő osztály:
map.put (targetAnnotation, targetValue);
3.2.JDK 8 Végrehajtás
A Java 8 implementációk tárolódnak annotációk osztályon belüli információk AnnotationData . Ehhez az objektumhoz a annotationData módszer. Megállítjuk a hozzáférhetőséget a annotationData módszer a igaz mivel ez egy privát módszer:
Method módszer = Class.class.getDeclaredMethod (ANNOTATION_METHOD, null); method.setAccessible (true);
Most hozzáférhetünk annotációk terület. Mivel ez a mező egyben privát mező is, a hozzáférhetőséget meg fogjuk határozni igaz:
A mező kommentárjai = annotationData.getClass (). GetDeclaredField (ANNOTATIONS); annotations.setAccessible (true);
Ez a mező annotációk gyorsítótár-térképével rendelkezik, amely megjegyzés osztályt és érték objektumot tárol. Változtassunk ezen:
Térkép map = annotations.get (annotationData); map.put (targetAnnotation, targetValue);
4. Alkalmazás
Vegyük ezt a példát:
Üdvözlő üdvözlet = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Üdvözlet!" + Üdvözlet.greet () + "!!");
Ez a „Jó reggelt” üdvözlet lesz, mivel ez az érték, amelyet a jegyzetekkel elláttunk.
Most létrehozunk még egy objektumot Üdvözlő típus, amelynek értéke: „Jó estét”:
Greeter targetValue = new DynamicGreeter ("Jó estét");
Frissítsük az annotációs térképet az új értékkel:
alterAnnotationValueJDK8 (Üdvözlet.osztály, Üdvözlő.osztály, célérték);
Ellenőrizzük újra az üdvözlet értékét:
üdvözlet = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Üdvözlet!" + Üdvözlet.greet () + "!!");
„Jó estét” fog köszönni.
5. Következtetés
A Java implementációk két adatmezőt használnak a kommentáradatok tárolásához: annotációk, kijelentetteJegyzetek. A különbség e kettő között: Először a szülő osztályokból származó jegyzetek is megjelennek, később pedig csak az aktuális osztályra.
Mivel a végrehajtása getAnnotation különbözik a JDK 7 és a JDK 8, itt használjuk annotációk tereptérkép az egyszerűség kedvéért.
És mint mindig, a megvalósítás forráskódja elérhető a Githubon.