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.