logo

Java Reflection API

השתקפות ג'אווה הוא תהליך של בחינה או שינוי של התנהגות זמן הריצה של מחלקה בזמן ריצה .

ה 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
התקשר לשיטה פרטית מכיתה אחרת