השתקפות ג'אווה הוא תהליך של בחינה או שינוי של התנהגות זמן הריצה של מחלקה בזמן ריצה .
ה java.lang.Class class מספקת שיטות רבות שניתן להשתמש בהן כדי לקבל מטא נתונים, לבחון ולשנות את התנהגות זמן הריצה של מחלקה.
החבילות java.lang ו-java.lang.reflect מספקות שיעורים לשיקוף ג'אווה.
תורשת java
איפה משתמשים בו
ה-Reflection API משמש בעיקר ב:
- IDE (סביבת פיתוח משולבת) למשל, Eclipse, MyEclipse, NetBeans וכו'.
- מנפה
- כלי בדיקה וכו'.
- בכמה דרכים נוכל לקבל את המופע של Class Class?
- איך יוצרים את הכלי javap?
- כיצד ליצור את הכלי appletviewer?
- איך לגשת למתודה הפרטית מחוץ לכיתה?
כיתת java.lang.Class
הכיתה java.lang.Class מבצעת בעיקר שתי משימות:
- מספק שיטות לקבל את המטא נתונים של מחלקה בזמן ריצה.
- מספק שיטות לבחון ולשנות את התנהגות זמן הריצה של מחלקה.
שיטות נפוצות של Class Class:
שיטה | תיאור |
---|---|
1) מחרוזת ציבורית getName() | מחזירה את שם הכיתה |
2) מחלקה סטטית ציבורית forName(String className) זורק ClassNotFoundException | טוען את המחלקה ומחזיר את ההפניה של המחלקה. |
3) אובייקט public newInstance() זורק InstantiationException,IllegalAccessException | יוצר מופע חדש. |
4) בוליאני ציבורי isInterface() | בודק אם זה ממשק. |
5) בוליאני ציבורי isArray (); | בודק אם זה מערך. |
6) בוליאני ציבורי הוא פרימיטיבי() | בודק אם הוא פרימיטיבי. |
7) מחלקה ציבורית getSuperclass() | מחזירה את הפניה לכיתה העל. |
8) שדה ציבורי[] getDeclaredFields() זורק SecurityException | מחזירה את מספר השדות הכולל של מחלקה זו. |
9) שיטה ציבורית[] getDeclaredMethods() זורקת SecurityException | מחזירה את המספר הכולל של שיטות של מחלקה זו. |
10) Constructor public[] getDeclaredConstructors() זורק SecurityException | מחזירה את המספר הכולל של בנאים של מחלקה זו. |
11) שיטה ציבורית getDeclaredMethod(שם מחרוזת,Class[] parameterTypes) זורקת NoSuchMethodException,SecurityException | מחזירה את מופע מחלקת השיטה. |
איך להשיג את האובייקט של הכיתה?
ישנן 3 דרכים להשיג את המופע של Class Class. הם כדלקמן:
- שיטת forName() של Class Class
- שיטת getClass() של מחלקת Object
- תחביר .class
1) שיטת forName() של Class Class
- משמש לטעינת המחלקה באופן דינמי.
- מחזירה את המופע של Class Class.
- יש להשתמש בו אם אתה יודע את השם המלא של הכיתה. זה לא יכול לשמש עבור טיפוסים פרימיטיביים.
בואו נראה את הדוגמה הפשוטה של שיטת forName() .
שם קובץ: Test.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
תְפוּקָה:
Simple
2) שיטת getClass() של מחלקת Object
זה מחזיר את המופע של Class Class. יש להשתמש בו אם אתה יודע את הסוג. יתר על כן, ניתן להשתמש בו עם פרימיטיבים.
קודי שגיאה של לינוקס
שם קובץ: Test.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
תְפוּקָה:
Simple
3) תחביר .class
אם סוג זמין, אך אין מופע, אז ניתן להשיג Class על ידי הוספת '.class' לשם הטיפוס. זה יכול לשמש גם עבור סוגי נתונים פרימיטיביים.
שם קובץ: Test.java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
תְפוּקָה:
boolean Test
קביעת אובייקט המחלקה
השיטות הבאות של Class class משמשות לקביעת אובייקט המחלקה:
1) בוליאני ציבורי isInterface(): קובע אם אובייקט ה-Class שצוין מייצג סוג ממשק.
תוכנית מספרים ראשוניים ב-java
2) בוליאני ציבורי isArray(): קובע אם אובייקט Class זה מייצג מחלקה של מערך.
3) בוליאני ציבורי isPrimitive(): קובע אם אובייקט ה-Class שצוין מייצג סוג פרימיטיבי.
בואו נראה את הדוגמה הפשוטה של Reflection API כדי לקבוע את סוג האובייקט.
שם קובץ: Test.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
תְפוּקָה:
false true
יתרונות וחסרונות של רפלקציה
תמיד יש להשתמש בהשתקפות Java בזהירות. בעוד שהשתקפות מספקת הרבה יתרונות, יש לה גם כמה חסרונות. בואו נדון תחילה ביתרונות.
יתרונות: בדיקה של ממשקים, מחלקות, שיטות ושדות בזמן ריצה אפשרית באמצעות רפלקציה, גם מבלי להשתמש בשמותיהם במהלך זמן ההידור. אפשר גם לקרוא לשיטות, ליצור צליל או להגדיר את הערך של שדות באמצעות השתקפות. זה עוזר ביצירת סביבות פיתוח חזותי ודפדפני כיתה המספקים סיוע למפתחים לכתוב את הקוד הנכון.
הפליקסר שלי
חסרונות: באמצעות השתקפות, אפשר לשבור את עקרונות האנקפסולציה. ניתן לגשת לשיטות ולשדות הפרטיים של מחלקה באמצעות רפלקציה. לפיכך, השתקפות עלולה לדלוף נתונים חשובים לעולם החיצון, וזה מסוכן. לדוגמה, אם אחד ניגש לחברים הפרטיים של מחלקה ומגדיר לו ערך null, אז המשתמש השני של אותה מחלקה יכול לקבל את NullReferenceException, והתנהגות זו אינה צפויה.
חסרון נוסף הוא התקורה בביצועים. מכיוון שהסוגים בהשתקפות נפתרים באופן דינמי, לא ניתן לבצע אופטימיזציה של JVM (Java Virtual Machine). לכן, הפעולות המבוצעות על ידי השתקפויות הן בדרך כלל איטיות.
סיכום
בגלל החסרונות שצוינו לעיל, מומלץ בדרך כלל להימנע משימוש בהשתקפות. זוהי תכונה מתקדמת שאמורה לשמש רק מתכנתים או מפתחים שיש להם ידע טוב ביסודות השפה. תמיד תזכור! בכל פעם שמשתמשים בהשתקפות, אבטחת האפליקציה נפגעת.
הנושאים הבאים של מדריך Reflection API
שיטת newInstance()הבנת כלי javap
יצירת כלי javap
יצירת כלי appletviewer
התקשר לשיטה פרטית מכיתה אחרת