שינוי פרמטרי ההערות בזמן ריצה

1. סקירה כללית

ביאורים , צורה של מטא נתונים שניתן להוסיף לקוד Java. אלה ביאורים ניתן לעבד בזמן קומפילציה ולהטמיע בקבצי מחלקה או שניתן לשמור ולגשת אליהם בזמן הריצה באמצעות הִשׁתַקְפוּת .

במאמר זה נדון כיצד ניתן לשנות ביאור ערך בזמן הריצה באמצעות הִשׁתַקְפוּת. נשתמש בהערה ברמת הכיתה לדוגמא זו.

2. ביאור

ג'אווה מאפשרת יצירת חדש ביאורים באמצעות אלה הקיימים. בצורה הפשוטה ביותר, הערה מיוצגת כ- @ סמל ואחריו שם הערה:

@Override

בואו ניצור ביאור משלנו גרטר:

@Retention (RetentionPolicy.RUNTIME) ציבורי @ ממשק גרטר {ברירת המחדל של מחרוזת ברכה () ""; }

כעת ניצור מחלקת Java ברכות המשתמשת ברמת הכיתה ביאור :

@Greeter (greet = "בוקר טוב") ברכות בכיתה ציבורית {} 

כעת ניגש לערך ההערות באמצעות השתקפות. כיתת ג'אווה מעמד מספק שיטה getAnnotation כדי לגשת להערות של כיתה:

ברכות בגרות = Greetings.class.getAnnotation (Greeter.class); System.out.println ("שלום לך," + greetings.greet () + "!!");

3. שנה ביאור

כיתת ג'אווה מעמד שומר מפה לניהול ביאורים - ביאור כיתה כמפתחות ו ביאור אובייקט כערך:

מַפָּה מַפָּה;

אנו נעדכן מפה זו כדי לשנות את ההערה בזמן הריצה. הגישה לגישה למפה זו שונה ביישומי JDK שונים. נדון בזה עבור JDK7 ו- JDK8.

3.1.יישום JDK 7

כיתת ג'אווה מעמד יש שדה ביאורים. מכיוון שמדובר בשדה פרטי, כדי לגשת אליו, עלינו להגדיר את הנגישות של השדה ל נָכוֹן. Java מספקת שיטה getDeclaredField כדי לגשת לכל שדה בשמו:

הערות שדה = Class.class.getDeclaredField (ANNOTATIONS); annotations.setAccessible (נכון); 

עכשיו, בואו נגיש למפת הערות לשיעור גרטר:

 מַפָּה מפה = annotations.get (targetClass);

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

map.put (targetAnnotation, targetValue);

3.2.יישום JDK 8

חנויות יישומי Java 8 ביאורים מידע בתוך כיתה הערות נתונים . אנו יכולים לגשת לאובייקט זה באמצעות ה- הערה נתונים שיטה. נגדיר נגישות ל הערה נתונים שיטה ל נָכוֹן כיוון שזו שיטה פרטית:

שיטת שיטה = Class.class.getDeclaredMethod (ANNOTATION_METHOD, null); method.setAccessible (נכון);

עכשיו, אנחנו יכולים לגשת ביאורים שדה. מכיוון ששדה זה הוא גם שדה פרטי, אנו נגדיר נגישות אליו נָכוֹן:

הערות שדה = annotationData.getClass (). GetDeclaredField (ANNOTATIONS); annotations.setAccessible (נכון);

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

מַפָּה מפה = annotations.get (annotationData); map.put (targetAnnotation, targetValue);

4. יישום

בואו ניקח דוגמא זו:

ברכות בגרות = Greetings.class.getAnnotation (Greeter.class); System.err.println ("שלום לך", + greetings.greet () + "!!");

זה יברך את "בוקר טוב" מכיוון שזה הערך שסיפקנו להערה.

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

Greeter targetValue = DynamicGreeter חדש ("ערב טוב"); 

בואו ונעדכן את מפת ההערות בערך החדש:

alterAnnotationValueJDK8 (Greetings.class, Greeter.class, targetValue);

בואו נבדוק שוב את ערך הברכה:

ברכות = Greetings.class.getAnnotation (Greeter.class); System.err.println ("שלום לך", + greetings.greet () + "!!");

זה יברך כ"ערב טוב ".

5. מסקנה

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

כמו היישום של getAnnotation שונה ב- JDK 7 ו- JDK 8, אנו משתמשים כאן ביאורים מפת שדה לפשטות.

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


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