Java Reflection הוכן על-ידי אחמד ג'בארה

Slides:



Advertisements
Similar presentations
Object Oriented 33 MCSD DORON AMIR
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
האוניברסיטה העברית בירושלים
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
1 Spring Semester 2007, Dept. of Computer Science, Technion Internet Networking recitation #3 Internet Control Message Protocol (ICMP)
מה היום ? - - חזרה מהירה. - קריאה וכתיבה לקבצים. - בניית תוכנית כתיבה low-level - בניית ערוץ גלובלי והדגמה מול חומרה - low-level DAQ, פולימורפיזם וטריגר.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Safari On-line books. מה זה ספארי ספארי זו ספריה וירטואלית בנושא מחשבים היא כוללת יותר מ כותרים כל הספרים הם בטקסט מלא ניתן לחפש ספר בנושא מסוים.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Interpolation Functions in Matlab By Dmitriy Katsif.
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Object Oriented Programming
Tirgul 12 Trees 1.
Object Oriented Programming
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
Object Oriented Programming
Object Oriented Programming
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
מבוא לתכנות מונחה עצמים Object Oriented Programming
מבוא למדעי המחשב – סמסטר א' תשע"ב
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים בשפת JAVA
ממשקים - interfaces איך לאפשר "הורשה מרובה".
בניית מחסנית סטטית Static Stack Implementation מורים מובילים תשע"ה
אובייקטים ומחלקות קרן כליף.
ניתוח מערכות מידע תכנות ב C#
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים ושפת JAVA
הכמסה – Encapsulation עקרון ההכמסה
מבוא למדעי המחשב – סמסטר א' תשע"ד
מבוא לתכנות מונחה עצמים Object Oriented Programming
תרגול 10 המשך תכנות מונחה עצמים.
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

Java Reflection הוכן על-ידי אחמד ג'בארה 07:16:18 חומרי עזר שהוכנו ע"י משתתפי קורס מורים מובילים תשע"א ניתן להשתמש בחומרים לצורך הוראה בלבד. אסור לפרסם את החומרים או לעשות בהם שימוש מסחרי כלשהו ללא קבלת אישור מראש מצוות הפיתוח Java Reflection הוכן על-ידי אחמד ג'בארה

מה זה ? 07:16:18 Reflection is the ability of a running program to examine itself and its software environment, and to change what it does depending on what it finds מנגנון שמאפשר לתוכנית בשפת ג'אווה לבחון/לשנות את עצמה בזמן ריצה, הן בפן המבני והן בהתנהגותי. דוגמאות : התוכנית תדע לברר ולמצוא את רשימת השיטות, הבנאים והתכונות של מחלקה מסוימת בזמן ריצה. התוכנית תדע לקחת את מרכיבי המחלקה ולהשתמש בהן. למשל, להפעיל את אחת השיטות ליצור אובייקט דרך אחד הבנאים בהינתן אובייקט כלשהו, התוכנית תדע למצוא מאיזה סוג מחלקה הוא ואת ההיררכיה של מחלקות הירושה. בקצרה: בעזרת מנגנון זה נוכל לעשות כל מה שידענו לעשות עד כה רק בזמן ריצה.

למה זה טוב ? 07:16:18 עיקר השימוש ב- Reflection הוא לפיתוח כלים (שיודעים לדלות מידע על התוכנית בזמן ריצתה) ויישומים שנדרשת בהם מידה רבה של גמישות. חשיבות המנגנון נובעת מעצם העובדה שניתן לכתוב תוכניות שמסוגלות לעבוד עם מחלקות ולהפעיל שיטות שהתוכנית לא ידעה על קיומן בזמן קומפילציה.

איך עושים את זה ? 07:16:18 כדי שתוכנית תוכל לבחון את המבנה של עצמה ואת זה של סביבתה יש צורך שלתוכנית יהיה ייצוג לעצמה. כלומר, התוכנית מחזיקה מידע שמייצג אותה. מידע כזה נקרא metadata בסביבה שהיא מונחית עצמים, מידע זה נשמר באובייקטים שנקראים metaobjects . תהליך שבו תוכנית בוחנת בזמן ריצה את ה- metaobjects בסביבת הריצה שלה נקרא introspection שפת ג'אווה מחזיקה לכל מחלקה בשפה metaobject שמכיל מידע מבני/התנהגותי אודות מחלקה זו.

איך עושים את זה ? המחלקה Class 07:16:18 נקודת ההתחלה היא הכרת המחלקה Class שמוגדרת ב- java.lang.Class כל מחלקה שמוגדרת בתוכנית ונטענת לזכרון מיוצגת על ידי metaobject מסוג המחלקה Class. אובייקט זה (שנוצר אוטומטית על ידי ה- JVM) מכיל מידע אודות המחלקה וגם פעולות שמאפשרות לברר מידע זה. מידע זה כולל החבילה שמשתייכת אליה המחלקה מחלקת הבסיס של מחלקה זו רשימת השיטות של המחלקה רשימת בנאים תכונות וכו'

אובייקט מסוג המחקלה Class - דוגמה 07:16:18 public class Point{ private int x, y; public Point(int x, int y){ this.x = x; this.y = y; } public void show() { System.out.print(“(“+x+”,”+y+”)”); public class Program { public static void main(String[] args){ Point p1 = new Point(2,3); Point p2 = new Point(5,1); p1.show(); p2.show(); תוכנית זו מגדירה מחלקה Point ויוצרת שני אובייקטים מסוג מחלקה זו. בפועל, יש לנו עוד אובייקט נוסף מסוג מחלקה אחרת שנקראת Class. אובייקט זה נוצר בעבור המחלקה Point והוא מכיל מידע מבני עליה. אובייקט זה יידע להגיד לנו מי היא מחלקת הבסיס של Point, איזה שיטות יש ב- Point .

Base-level Objects vs. Meta-level Objects 07:16:18 ובכן, בסביבת הריצה של תוכנית ג'אווה מבחינים בין שני סוגי אובייקטים: אובייקטים שהתוכנית שלנו יוצרת (כמו בדרך כלל) והם מכונים : base-level objects אובייקטים לייצוג התוכנית (metaobjects) והם מכונים : meta-level objects Metaobject (Point) Meta-level p1 p2 x=2 y=3 x=5 y=1 Base-level

איך ניגשים לאובייקט מסוג Class? 07:16:18 public class Point{ private int x, y; public Point(int x, int y){ this.x = x; this.y = y; } public void show() { System.out.print(“(“+x+”,”+y+”)”); public class Program { public static void main(String[] args){ Point p1 = new Point(2,3); Point p2 = new Point(5,1); p1.show(); p2.show(); ישנן מספר דרכים תכונה סטטית של המחלקה Point.class שם המחלקה (ניתן כמחרוזת) Class.forName(“Point”) אובייקט כלשהו מסוג המחלקה. p1.getClass() בשלושת המקרים קיבלנו את אותה תשובה. מצביע על אובייקט מסוג המחלקה Class שמכיל מידע על המחלקה Point. לכן, Class c1 = Point.class; Class c2 = Class.forName(“Point”); Class c3 = p1.getClass();

Base-level Objects vs. Meta-level Objects 07:16:18 Metaobject (Point) Meta-level Class.forName(“Point”) p1.getClass() Point.class p2.getClass() p2 x=2 y=3 x=5 y=1 p1 Base-level

הצגת היררכית המחלקות של אובייקט כלשהו 07:16:18 public class Point{ private int x, y; public Point(int x, int y){ this.x = x; this.y = y; } public void show() { System.out.print(“(“+x+”,”+y+”)”); public class Program { public static void showHierarchy(Object o){ Class c = o.getClass(); do { System.out.println(c.getName()); c=c.getSuperclass(); }while (c!=null); public static void main(String[] args) { showHierarchy(new Point(2,3)); showHierarchy("Test"); showHierarchy(7); השיטה הסטטית showHierarchy מקבלת אובייקט כלשהו. הסוג האמיתי (הדינמי) של הפרמטר o אינו ידוע ויכול להיות כל דבר. השיטה הסטטית מדפיסה את מסלול הירושה מהמחלקה הבסיסית Object ועד למחלקה האמיתית של o. שים לב, בשיטה הראשית, כל פעם שולחים ארגומנט מסוג אחר. נקודת המפתח של הפתרון היא שורה 12 שהחזירה לנו את האובייקט שמכיל את המידע המבני של המחלקה האמיתית של הפרמטר o.

הצגת מבנה מחלקה כלשהי import java.lang.reflect.*; 07:16:18 import java.lang.reflect.*; public class Program { public static void showStructure(Object o) { Class c = o.getClass(); Field[] fs = c.getDeclaredFields(); Method[] ms = c.getDeclaredMethods(); Constructor[] cs = c.getDeclaredConstructors(); for (int k=0; k < fs.length; k++) System.out.println(fs[k]); for (int k=0; k < ms.length ; k++) System.out.println(ms[k]); for (int k=0; k < cs.length ; k++) System.out.println(cs[k]); } public static void main(String[] args) { showStructure(new Point(2,3)); השיטה הסטטית showStructure מקבלת אובייקט כלשהו. הסוג האמיתי (הדינמי) של הפרמטר o אינו ידוע ויכול להיות כל דבר. השיטה הסטטית מדפיסה את מבנה המחלקה של אובייקט זה. (Point) שורה 4 מבקשת אובייקט מסוג Class. שורה 5 מפעילה שיטה שמחזירה מערך של כל תכונות המחלקה . שים לב, שכל תכונה היא אובייקט שורה 6 מפעילה שיטה שמחזירה מערך של שיטות המחלקה. כל שיטה היא אובייקט מסוג המחלקה Method. המידע שמתקבל שייך רק למחלקה עצמה ואינו כולל מידע שמחלקה זו ירשה. לקבלת מידע (ציבורי בלבד) שהתקבל בירושה יש להשתמש בשיטות האלה : getFields, getMethods, getConstructors.

שיטה אחת להצגת מצב כל אובייקט. 07:16:18 public class Point { private int x,y; private String color; public Point(int x, int y, String color){ this.x=x; this.y=y; this.color = color; } public void show() { System.out.println("("+x+","+y+","+color+")"); השיטה הסטטית showState מקבלת אובייקט כלשהו. הסוג האמיתי (הדינמי) של הפרמטר o אינו ידוע ויכול להיות כל דבר. השיטה הסטטית עוברת על כל תכונות המחלקה. לכל תכונה היא מדפיסה את ערכה באובייקט o שהועבר כפרמטר. במקרה והתכונה מוגדרת כפרטית, משנים לה את ההרשאות לציבורית ואז מבקשים את הערך. כמובן ניתן לשנות בקלות את השיטה כדי לכלול בהדפסה את התכונות שהתקבלו בירושה. import java.lang.reflect.*; public class Program { public static void showState(Object o) throws Exception{ Class c = o.getClass(); Field[] fs = c.getDeclaredFields(); for (int k=0; k < fs.length; k++){ if (!fs[k].isAccessible()) fs[k].setAccessible(true); System.out.println(fs[k].get(o)); } public static void main(String[] args) throws Exception{ showState(new Point(2,3,"Red"));

הפעלת שיטה בזמן ריצה – מצביע לפונקציה 07:16:18 public class Point { private int x,y; private String color; public Point(int x, int y, String color){ this.x=x; this.y=y; this.color = color; } public void show() { System.out.println("("+x+","+y+","+color+")"); השיטה הסטטית methodCallמקבלת אובייקט כלשהו. הסוג האמיתי (הדינמי) של הפרמטר o אינו ידוע ויכול להיות כל דבר. השיטה הסטטית בודקת האם לאובייקט זה יש שיטה בשם show שלא מקבלת פרמטרים. אם לא, מוצגת הודעה. אם כן, שיטה זו מופעלת. השיטה getMethod מקבלת את שם השיטה אותה מחפשים, ורשימה של סוגי פרמטרים (כולם אובייקטים מסוג Class). אם השיטה לא מקבלת פרמטרים מעבירים null. השיטה invoke מפעילה את השיטה שנמצאת באובייקט m . הפרמטר הראשון שלה הוא האובייקט עליו פועלת השיטה, והפרמטר השני רשימת ארגומנטים לשיטה. import java.lang.reflect.*; public class Program { public static void methodCall(Object o) throws Exception{ Class c = o.getClass(); Method m = c.getMethod("show",null); if (m==null) System.out.println("no such method"); else m.invoke(o, null); } public static void main(String[] args) throws Exception{ methodCall(new Point(2,3,"Red"));

הפעלת שיטה פרטית השיטה הסטטית methodCallמקבלת אובייקט כלשהו. 07:16:18 public class Point { private int x,y; private String color; public Point(int x, int y, String color){ this.x=x; this.y=y; this.color = color; } private void show() { System.out.println("("+x+","+y+","+color+")"); השיטה הסטטית methodCallמקבלת אובייקט כלשהו. הסוג האמיתי (הדינמי) של הפרמטר o אינו ידוע ויכול להיות כל דבר. השיטה הסטטית בודקת האם לאובייקט זה יש שיטה בשם show שלא מקבלת פרמטרים. אם לא, מוצגת הודעה. אם כן, שיטה זו מופעלת. השיטה getMethod מקבלת את שם השיטה אותה מחפשים, ורשימה של סוגי פרמטרים (כולם אובייקטים מסוג Class). אם השיטה לא מקבלת פרמטרים מעבירים null. השיטה invoke מפעילה את השיטה שנמצאת באובייקט m . הפרמטר הראשון שלה הוא האובייקט עליו פועלת השיטה, והפרמטר השני רשימת ארגומנטים לשיטה. import java.lang.reflect.*; public class Program { public static void main(String[] args) throws Exception{ Point p1 = new Point(2,3); Class c = p1.getClass(); Method m = c.getMethod("show", null); If (m!=null) { if (!m.isAccessible()) m.setAccessible(true); m.invoke(p1, null); { }

שכפול מערך אובייקטים מסוגים שונים 07:16:18 נתון מערך אובייקטים מסוגים שונים. למשל , Object[] ברור שמערך כזה יכול להחזיק אובייקטים מכל סוג שנרצה. המטרה שכפול המערך באופן מלא. כלומר, שכפול המערך כאובייקט ושכפול כל אחד מהאובייקטים שלו. הבעיה כדי לשכפל אובייקט יש צורך להשתמש בבנאי העתקה. אך לצורך שימוש בבנאי העתקה עלינו לדעת מראש את שם המחלקה. אבל נקודת המוצא שלנו שאנחנו לא יודעים שום דבר על האובייקטים של המערך. פתרון נבדוק את גודל המערך ונקצה מערך של אובייקטים חדש. אך, זה רק מערך הפניות ויש להקצות את האובייקטים האמיתיים. לכל תא במערך נבקש את ה- metaobject שלו. מתוך ה- metaobject נברר אם המחלקה המקורית של האובייקט מכילה בנאי העתקה. במידה וכן נפעיל בנאי זה ובכך נשכפל את האובייקט. במידה ואין קיימות לא מעט אפשרויות נוספות כדי להתמודד (Cloning למשל) אך לא נטפל בהן כאן ולכן נבצע הפניה לאובייקט המקורי. הדוגמה שנציג כאן מחזיקה מערך צורות (רק לצורך הפשטות בלבד). דרך הפתרון לא משתנה.

שכפול מערך אובייקטים מסוגים שונים 07:16:18 public abstract class Shape { abstract double calcArea(); { public class Circle extends Shape { private int x,y; private int rad; public Circle(int x, int y, int rad) { this.x = x; this.y = y; this.rad = rad; { public Circle(Circle c) { this.x = c.x; this.y = c.y; this.rad = c.rad; } double calcArea() { return Math.PI*rad*rad; public class Rect extends Shape { private int w,h; public Rect(int w, int h) { this.w = w; this.h = h; } public Rect(Rect r) { this.w = r.w; this.h = r.h; public double calcArea() { return w*h; {

שכפול מערך אובייקטים מסוגים שונים - המשך 07:16:18 import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.*; public class Program { public static Shape[] duplicate(Shape[] shapes) throws Exception{ if (shapes==null) return null; Shape[] dShapes = new Shape[shapes.length]; for (int k=0; k < shapes.length ; k++){ Class c = shapes[k].getClass(); Constructor ctr = c.getConstructor(c); If (ctr != null) dShapes[k] = (Shape)ctr.newInstance(shapes[k]); else dShapes[k] = shapes[k]; } return dShapes; public static void main(String[] args) throws Exception{ Shape[] shapes = {new Circle(1,1,3), new Circle(5,4,1), new Rect(4,7),new Circle(1,1,1)}; Shape[] dShapes; dShapes=duplicate(shapes); {

שכפול מערך אובייקטים מסוגים שונים - המשך 07:16:18 צילום המסך מראה את הזכרון של שני המערכים (מקורי + העתק). חשוב לשים לב שתי נקודות : המערכים והאיבירים שלהם הם אובייקטים שונים לחלוטין במובן הזה שיש להם כתובות שונות בזכרון (לכל אחד מספר מזהה אחר). בנוסף סוג המחלקה של כל אובייקט נשמר גם הוא.