Egyéni kommentár létrehozása Java-ban

1. Bemutatkozás

A Java annotációk egy olyan mechanizmus, amely metaadat-információkat ad hozzá a forráskódunkhoz. A Java erőteljes részét képezik, és a JDK5-be is felvették őket. A kommentárok alternatívát kínálnak az XML-leírók és a jelölőfelületek használatához.

Bár csatolhatjuk őket csomagokhoz, osztályokhoz, interfészekhez, módszerekhez és mezőkhöz, a kommentárok önmagukban nem befolyásolják a program futtatását.

Ebben az oktatóanyagban arra fogunk koncentrálni, hogy miként hozhatunk létre egyedi jegyzeteket és hogyan dolgozhatjuk fel azokat. Az annotációkról bővebben az annotáció alapjairól szóló cikkünkben olvashatunk.

2. Egyéni kommentárok létrehozása

Három egyedi kommentárt fogunk létrehozni azzal a céllal, hogy egy objektumot JSON karakterláncba sorosítsunk.

Az elsőt osztály szinten használjuk, hogy jelezzük a fordítónak, hogy objektumunk sorosítható. Ezután a másodikat azokra a mezőkre alkalmazzuk, amelyeket fel akarunk venni a JSON karakterláncba.

Végül a harmadik annotációt használjuk a módszer szintjén, hogy meghatározzuk az objektum inicializálásához használt módszert.

2.1. Osztályszintű kommentár példa

Az első lépés az egyéni kommentár létrehozása felé hogy a @felület kulcsszó:

public @interface JsonSerializable {}

A következő lépés az meta-annotációk hozzáadása a hatókör és a cél megadásához egyéni kommentárunk:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.Type) public @interface JsonSerializable {}

Mint láthatjuk, az első feljegyzésünk futási idejű láthatósággal rendelkezik, és alkalmazhatjuk típusokra (osztályokra). Ráadásul nincs módszere, és így egyszerű jelölőként szolgál a JSON-ba sorolható osztályok megjelölésére.

2.2. Példa mezőszintű kommentárra

Ugyanígy hozzuk létre a második feljegyzésünket, hogy megjelöljük azokat a mezőket, amelyeket be fogunk venni a létrehozott JSON-ba:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.FIELD) public @interface JsonElement {public String key () default ""; }

A kommentár egy String paramétert deklarál alapértelmezett értékként a "kulcs" nevet és egy üres karakterláncot.

Amikor metódusokkal hozunk létre egyedi kommentárokat, tisztában kell lennünk azzal, hogy ezek A metódusoknak nem lehetnek paramétereik, és nem hozhatnak kivételt. Is, a visszatérési típusok csak a primitívekre, a String, az osztályra, az enumokra, az annotációkra és az ilyen típusú tömbökre korlátozódnak,és az alapértelmezett érték nem lehet null.

2.3. Példa a módszer szintjére

Képzeljük el, hogy mielőtt egy objektumot JSON karakterláncba sorozunk, végre akarunk hajtani valamilyen módszert az objektum inicializálására. Ezért létrehozunk egy jegyzetet a módszer jelölésére:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface Init {}

Nyilvános, futásidejű láthatósággal ellátott jegyzetet hirdettünk, amelyet alkalmazhatunk osztályaink módszereire.

2.4. Megjegyzések alkalmazása

Most nézzük meg, hogyan használhatjuk az egyedi kommentárokat. Képzeljük el például, hogy van egy típusú objektumunk Személy hogy JSON karakterláncba szeretnénk sorosítani. Ennek a típusnak van egy módszere, amely nagy- és nagybetűket ír az első és a vezetéknévben. Az objektum sorosítása előtt ezt a módszert kell meghívnunk:

@JsonSerializable public class Person {@JsonElement private String keresztnév; @JsonElement privát karakterlánc vezetéknév; @JsonElement (key = "personAge") privát String age; privát String cím; @Init private void initNames () {this.firstName = this.firstName.substring (0, 1) .toUpperCase () + this.firstName.substring (1); this.lastName = this.lastName.substring (0, 1) .toUpperCase () + this.lastName.substring (1); } // Normál mérőeszközök és beállítók}

Az egyedi kommentárok használatával jelezzük, hogy a Személy objektum egy JSON karakterláncra. Ezenkívül a kimenetnek csak a keresztnév, vezetéknév, és kor az adott objektum mezői. Sőt, azt akarjuk, hogy initNames () metódust kell meghívni a szerializálás előtt.

A kulcs paramétere @JsonElement annotation to “personAge”, azt jelezzük, hogy ezt a nevet fogjuk használni a JSON kimenet mezőjének azonosítójaként.

A demonstráció érdekében elkészítettük initNames () privát, ezért nem tudjuk inicializálni az objektumunkat manuális hívással, és a kivitelezőink sem használják.

3. A kommentárok feldolgozása

Eddig láttuk, hogyan hozhatunk létre egyedi jegyzeteket, és hogyan használhatjuk fel őket a Személy osztály. Most, megnézzük, hogyan lehet kihasználni őket a Java Reflection API használatával.

Az első lépés annak ellenőrzése, hogy objektumunk-e nulla vagy sem, valamint hogy a típusának van-e @JsonSerializable kommentár vagy sem:

private void checkIfSerializable (Object object) {if (Objects.isNull (object)) {dobjon új JsonSerializationException ("A sorosítandó objektum null"); } Class clazz = object.getClass (); if { }}

Ezután bármilyen módszert keresünk @Init kommentárral, és végrehajtjuk az objektum mezejeinek inicializálásához:

private void InitializeObject (Object object) dobja a Kivételt {Class clazz = object.getClass (); for (Metódus metódus: clazz.getDeclaredMethods ()) {if (metódus.azAnnotationPresent (Init.osztály)) {metódus.AsetAccessible (igaz); method.invoke (objektum); }}}

Hívása módszer.setAccessible(igaz) lehetővé teszi számunkra a magánember kivégzését initNames () módszer.

Az inicializálás után iterálunk objektumunk mezőin, lekérjük a JSON elemek kulcsát és értékét, és feltesszük őket egy térképre. Ezután létrehozzuk a JSON karakterláncot a térképről:

privát karakterlánc A getJsonString (Objektum objektum) dobja a Kivételt {Osztály clazz = object.getClass (); Map jsonElementsMap = új HashMap (); mert (Field mező: clazz.getDeclaredFields ()) {field.setAccessible (true); if (mező.isAnnotationPresent (JsonElement.class)) {jsonElementsMap.put (getKey (mező), (Karakterlánc) field.get (objektum)); }} Karakterlánc jsonString = jsonElementsMap.entrySet () .stream () .map (bejegyzés -> "\" "+ entry.getKey () +" \ ": \" "+ entry.getValue () +" \ "") .collect (Gyűjtők.csatlakozás (",")); return "{" + jsonString + "}"; }

Ismét használtuk terület.setAccessible(true) mert a Személy az objektum mezõi privátak.

JSON serializer osztályunk a fenti lépéseket ötvözi:

public class ObjectToJsonConverter {public String convertToJson (Object object) dobja a JsonSerializationException {try {checkIfSerializable (objektum); initizeObject (objektum); return getJsonString (objektum); } catch (e kivétel) {dobj új JsonSerializationException (e.getMessage ()); }}}

Végül futtatunk egy egység tesztet annak igazolására, hogy objektumunkat az egyedi kommentárok által meghatározott sorosítottuk-e:

@Test public void givenObjectSerializedThenTrueReturned () dobja JsonSerializationException {Személy személy = új Személy ("soufiane", "cheouati", "34"); JsonSerializer serializer = új JsonSerializer (); Karakterlánc jsonString = serializer.serialize (személy); assertEquals ("{\" personAge \ ": \" 34 \ ", \" keresztnév \ ": \" Soufiane \ ", \" vezetékNév \ ": \" Cheouati \ "}", jsonString); }

4. Következtetés

Ebben a cikkben azt láttuk, hogyan lehet különféle egyedi kommentárokat létrehozni. Ezután megbeszéltük, hogyan lehet felhasználni őket tárgyaink díszítésére. Végül megvizsgáltuk, hogyan lehet ezeket feldolgozni a Java Reflection API segítségével.

Mint mindig, a teljes kód elérhető a GitHubon.