יצירת הערה מותאמת אישית ב- Java

1. הקדמה

הערות Java הן מנגנון להוספת מידע מטא-נתונים לקוד המקור שלנו. הם חלק עוצמתי של Java, ונוספו ב- JDK5. ההערות מציעות אלטרנטיבה לשימוש במתארי XML ובממשקי סמן.

למרות שנוכל לצרף אותם לחבילות, מחלקות, ממשקים, שיטות ושדות, ההערות כשלעצמן אינן משפיעות על ביצוע התוכנית.

במדריך זה נתמקד כיצד ליצור הערות מותאמות אישית וכיצד לעבד אותן. אנו יכולים לקרוא עוד על הערות במאמרנו על יסודות ההערות.

2. יצירת הערות מותאמות אישית

אנו ניצור שלוש הערות מותאמות אישית במטרה לסדר אובייקט למחרוזת JSON.

נשתמש בראשון ברמת הכיתה כדי לציין למהדר שאפשר לסדר את האובייקט שלנו. לאחר מכן, נשתמש בשני על השדות שאנו רוצים לכלול במחרוזת JSON.

לבסוף נשתמש בהערה השלישית ברמת השיטה כדי לציין את השיטה בה נשתמש לאתחל את האובייקט שלנו.

2.1. דוגמה להערות ברמת הכיתה

הצעד הראשון לקראת יצירת הערה מותאמת אישית הוא להצהיר על כך באמצעות @מִמְשָׁק מילת מפתח:

public @interface JsonSerializable {}

השלב הבא הוא ל הוסף מטא-הערות כדי לציין את ההיקף והיעד להערה המותאמת אישית שלנו:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.Type) ציבורי @ ממשק JsonSerializable {}

כפי שאנו רואים, ההערה הראשונה שלנו יש נראות בזמן ריצה, ואנחנו יכולים להחיל אותה על סוגים (שיעורים). יתר על כן, אין לו שיטות, ולכן הוא משמש כסמן פשוט לסימון מחלקות שניתן לסדרן ל- JSON.

2.2. דוגמה להערות ברמת השדה

באותה צורה, אנו יוצרים את ההערה השנייה שלנו כדי לסמן את השדות שאנחנו הולכים לכלול ב- JSON שנוצר:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.FIELD) ציבורי @ ממשק JsonElement {מפתח מחרוזת ציבורי () ברירת מחדל ""; }

ההערה מצהירה על פרמטר מחרוזת אחד עם השם "מפתח" ומחרוזת ריקה כערך ברירת המחדל.

בעת יצירת הערות מותאמות אישית בשיטות, עלינו להיות מודעים לכך שיטות חייבות להיות ללא פרמטרים, ואינן יכולות להוציא חריג. גַם, סוגי ההחזרה מוגבלים לפרימיטיביים, מחרוזת, מחלקה, enums, ביאורים ומערכים מסוגים אלה,וערך ברירת המחדל לא יכול להיות ריק.

2.3. דוגמה להערות ברמת השיטה

בואו נדמיין שלפני סדרת אובייקט למחרוזת JSON נרצה לבצע שיטה כלשהי לאתחול אובייקט. מסיבה זו, אנו ניצור הערה לסימון שיטה זו:

@ Retention (RetentionPolicy.RUNTIME) @ Target (ElementType.METHOD) פתיחה @ ממשק ראשוני {}

הכרזנו על הערה ציבורית עם נראות זמן ריצה שנוכל להחיל על שיטות השיעורים שלנו.

2.4. החלת ביאורים

עכשיו, בואו נראה איך נוכל להשתמש בהערות המותאמות אישית שלנו. למשל, בואו נדמיין שיש לנו אובייקט מסוג אדם שברצוננו לסדר לכדי מחרוזת JSON. לסוג זה יש שיטה שעושה אות באות ראשונה של השם הפרטי ושם המשפחה. נרצה להתקשר לשיטה זו לפני שעוררים את האובייקט בסידרה:

אדם בכיתה ציבורית @JsonSerializable {@JsonElement פרטי מחרוזת שם פרטי; שם משפחה פרטי מחרוזת @JsonElement; @JsonElement (key = "personAge") גיל מחרוזת פרטי; כתובת מחרוזת פרטית; @Init 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); } // גטרים וקובעים סטנדרטיים}

על ידי שימוש בהערות המותאמות אישית שלנו, אנו מציינים שנוכל לסדר את a אדם התנגד למחרוזת JSON. בנוסף, הפלט צריך להכיל רק את שם פרטי, שם משפחה, ו גיל שדות של אותו אובייקט. יתר על כן, אנו רוצים את initNames () שיטה להיקרא לפני סדרת סדר.

על ידי הגדרת ה- מַפְתֵחַ פרמטר של @JsonElement ביאור ל- "personAge", אנו מציינים שנשתמש בשם זה כמזהה עבור השדה בפלט JSON.

לצורך ההפגנה עשינו initNames () פרטי, כך שלא נוכל לאתחל את האובייקט שלנו על ידי קריאה אליו ידנית, וגם הבונים שלנו לא משתמשים בו.

3. עיבוד הערות

עד כה ראינו כיצד ליצור הערות מותאמות אישית וכיצד להשתמש בהן לקישוט אדם מעמד. עַכשָׁיו, אנו נראה כיצד לנצל אותם באמצעות ממשק ה- API של Reflection של Java.

הצעד הראשון יהיה לבדוק האם האובייקט שלנו הוא ריק או לא, כמו גם אם לסוגו יש את @JsonSerializable ביאור או לא:

בטל ריק פרטיIfSerializable (אובייקט אובייקט) {if (Objects.isNull (object)) {זרוק JsonSerializationException חדש ("האובייקט לסידור הוא אפס"); } Clazz class = object.getClass (); אם (! clazz.isAnnotationPresent (JsonSerializable.class)) {זרוק JsonSerializationException חדש ("המחלקה" + clazz.getSimpleName () + "לא מסומנת עם JsonSerializable"); }}

לאחר מכן, אנו מחפשים כל שיטה עם הערת @Init, ואנחנו מבצעים אותה כדי לאתחל את שדות האובייקט שלנו:

חלל פרטי initializeObject (אובייקט אובייקט) זורק חריג {Class clazz = object.getClass (); עבור (שיטת שיטה: clazz.getDeclaredMethods ()) {if (method.isAnnotationPresent (Init.class)) {method.setAccessible (true); method.invoke (אובייקט); }}}

השיחה של שיטה.setAccessible(נָכוֹן) מאפשר לנו לבצע את הפרטי initNames () שיטה.

לאחר האתחול, אנו חוזרים על שדות האובייקט שלנו, מאחזרים את המפתח והערך של רכיבי JSON ומכניסים אותם למפה. לאחר מכן, אנו יוצרים את המחרוזת JSON מהמפה:

מחרוזת פרטית getJsonString (אובייקט אובייקט) זורק חריג {Class clazz = object.getClass (); מפה jsonElementsMap = HashMap חדש (); עבור (שדה שדה: clazz.getDeclaredFields ()) {field.setAccessible (true); אם (field.isAnnotationPresent (JsonElement.class)) {jsonElementsMap.put (getKey (field), (String) field.get (object)); }} מחרוזת jsonString = jsonElementsMap.entrySet () .stream () .map (entry -> "\" "+ entry.getKey () +" \ ": \" "+ entry.getValue () +" \ "") .collect (Collectors.joining (",")); החזר "{" + jsonString + "}"; }

שוב, השתמשנו שדה.setAccessible(truה) בגלל ה אדם שדות האובייקט הם פרטיים.

מחלקת הסידור JSON שלנו משלבת את כל השלבים שלעיל:

מחלקה ציבורית ObjectToJsonConverter {public String convertToJson (אובייקט אובייקט) זורק JsonSerializationException {try {checkIfSerializable (object); initializeObject (אובייקט); החזר getJsonString (אובייקט); } לתפוס (חריג e) {לזרוק JsonSerializationException חדש (e.getMessage ()); }}}

לבסוף, אנו מבצעים בדיקת יחידה כדי לאמת שהאובייקט שלנו סידר לפי הגדרת ההערות המותאמות אישית שלנו:

@Test הציבור בטל שניתןObjectSerializedThenTrueReturned () זורק JsonSerializationException {אדם אדם = אדם חדש ("סופיאן", "cheouati", "34"); JsonSerializer serializer = JsonSerializer חדש (); מחרוזת jsonString = serializer.serialize (אדם); assertEquals ("{\" personAge \ ": \" 34 \ ", \" firstName \ ": \" Soufiane \ ", \" lastName \ ": \" Cheouati \ "}", jsonString); }

4. מסקנה

במאמר זה ראינו כיצד ליצור סוגים שונים של הערות מותאמות אישית. ואז דנו כיצד להשתמש בהם לקישוט החפצים שלנו. לבסוף בדקנו כיצד לעבד אותם באמצעות ה- Reflection API של Java.

כמו תמיד, הקוד השלם זמין ב- GitHub.


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