Tcl/Tk למתכנתים

Download Report

Transcript Tcl/Tk למתכנתים

א " עשת םיליבומ םירומ סרוק יפתתשמ י " ע ונכוהש רזע ירמוח .

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

Java Reflection

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

1

?

הז המ 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

.

יתוגהנתהב ןהו ינבמה ןפב ןה ,

הציר ןמזב

המצע תא תונשל / ןוחבל הווא ' ג תפשב תינכותל רשפאמש ןונגנמ .

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

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

השוריה  .

הציר ןמזב קר הכ דע תושעל ונעדיש המ לכ תושעל לכונ הז ןונגנמ תרזעב : הרצקב    2

?

בוט הז המל

לע עדימ תולדל םיעדויש ( םילכ חותיפל אוה Reflection ב שומישה רקיע .

תושימג לש הבר הדימ םהב תשרדנש םימושייו ) התציר ןמזב תינכותה  דובעל תולגוסמש תוינכות בותכל ןתינש הדבועה םצעמ תעבונ ןונגנמה תובישח  .

היצליפמוק ןמזב ןמויק לע העדי אל תינכותהש תוטיש ליעפהלו תוקלחמ םע 3

?

הז תא םישוע ךיא

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

התוא גציימש עדימ הקיזחמ תינכותה , רמולכ .

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

metaobjects  הצירה תביבסב metaobjects ה תא הציר ןמזב תנחוב תינכות ובש ךילהת introspection ארקנ הלש  עדימ ליכמש metaobject הפשב הקלחמ לכל הקיזחמ הווא ' ג תפש .

וז הקלחמ תודוא יתוגהנתה / ינבמ  4

Class הקלחמה ?

הז תא םישוע ךיא

java.lang.Class

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

Class הקלחמה םגו הקלחמה תודוא עדימ ליכמ ) JVM ה ידי לע תיטמוטוא רצונש ( הז טקייבוא .

הז עדימ ררבל תורשפאמש תולועפ ללוכ הז עדימ הקלחמה הילא תכייתשמש הליבחה  וז הקלחמ לש סיסבה תקלחמ הקלחמה לש תוטישה תמישר םיאנב תמישר תונוכת     ' וכו      5

המגוד Class הלקחמה גוסמ טקייבוא

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

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 לש סיסבה .

    6

Base-level Objects vs. Meta-level Objects

: םיטקייבוא יגוס ינש ןיב םיניחבמ הווא ' ג תינכות לש הצירה תביבסב , ןכבו base-level objects : םינוכמ םהו ) ללכ ךרדב ומכ ( תרצוי ונלש תינכותהש םיטקייבוא  meta-level objects : םינוכמ םהו ) metaobjects ( תינכותה גוצייל םיטקייבוא  

Meta-level

Metaobject (Point)

Base-level

p1 x=2 y=3 p2 x=5 y=1

7

?

Class גוסמ טקייבואל םישגינ ךיא

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

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();    8

Base-level Objects vs. Meta-level Objects

Meta-level

Metaobject (Point) Class.forName(“Point”)

Base-level

p1.getClass() p1 x=2 y=3 Point.class

p2 p2.getClass() x=5 y=1

9

והשלכ טקייבוא לש תוקלחמה תיכרריה תגצה

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

1.

2.

3.

4.

5.

6.

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 רטמרפה      10

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

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]); 14.

} 15.

public static void main(String[] args) { 16.

showStructure(new Point(2,3)); 17.

} 18.

}

יהשלכ הקלחמ הנבמ תגצה

טקייבוא תלבקמ showStructure תיטטסה הטישה .

והשלכ לוכיו עודי וניא o רטמרפה לש ) ימנידה ( יתימאה גוסה .

רבד לכ תויהל טקייבוא לש הקלחמה הנבמ תא הסיפדמ תיטטסה הטישה (Point) .

הז .

Class גוסמ טקייבוא תשקבמ 4 הרוש תונוכת לכ לש ךרעמ הריזחמש הטיש הליעפמ 5 הרוש טקייבוא איה הנוכת לכש , בל םיש .

הקלחמה תוטיש לש ךרעמ הריזחמש הטיש הליעפמ 6 הרוש הקלחמה גוסמ טקייבוא איה הטיש לכ .

הקלחמה .

Method ללוכ וניאו המצע הקלחמל קר ךייש לבקתמש עדימה .

השרי וז הקלחמש עדימ שי השוריב לבקתהש ) דבלב ירוביצ ( עדימ תלבקל getFields, : הלאה תוטישב שמתשהל .

getMethods, getConstructors         11

.

טקייבוא לכ בצמ תגצהל תחא הטיש

1.

2.

3.

4.

5.

6.

7.

8.

9.

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() { 10.

11.

12.

} } System.out.println("("+x+","+y+","+color+")"); 1.

2.

3.

4.

5.

6.

7.

8.

import java.lang.reflect.*; public class Program { public static void showState(Object o) throws Exception{ Class c = o.getClass(); Field[] fs = c.getDeclaredFields(); 9.

10.

11.

} for (int k=0; k < fs.length; k++){ if (!fs[k].isAccessible()) fs[k].setAccessible(true); System.out.println(fs[k].get(o)); 12.

} 13.

public static void main(String[] args) throws Exception{

14.

showState(new Point(2,3,"Red"));

15.

} 16.

} תלבקמ showState תיטטסה הטישה .

והשלכ טקייבוא וניא o רטמרפה לש ) ימנידה ( יתימאה גוסה .

רבד לכ תויהל לוכיו עודי תונוכת לכ לע תרבוע תיטטסה הטישה הכרע תא הסיפדמ איה הנוכת לכל .

הקלחמה .

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

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

השוריב      12

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

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() { 10.

11.

12.

} } System.out.println("("+x+","+y+","+color+")"); 1.

2.

3.

4.

5.

6.

7.

8.

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 9.

10.

} m.invoke(o, null); 11.

public static void main(String[] args) throws Exception{ 12.

13.

14.

} } methodCall(new Point(2,3,"Red")); טקייבוא תלבקמ methodCall תיטטסה הטישה .

והשלכ לוכיו עודי וניא o רטמרפה לש ) ימנידה ( יתימאה גוסה .

רבד לכ תויהל הטיש שי הז טקייבואל םאה תקדוב תיטטסה הטישה .

םירטמרפ תלבקמ אלש show םשב .

העדוה תגצומ , אל םא .

תלעפומ וז הטיש , ןכ םא התוא הטישה םש תא תלבקמ getMethod הטישה םלוכ ( םירטמרפ יגוס לש המישרו , םישפחמ תלבקמ אל הטישה םא .) Class גוסמ םיטקייבוא .

null םיריבעמ םירטמרפ תאצמנש הטישה תא הליעפמ invoke הטישה טקייבואה אוה הלש ןושארה רטמרפה .

m טקייבואב תמישר ינשה רטמרפהו , הטישה תלעופ וילע .

הטישל םיטנמוגרא        13

1.

2.

3.

4.

5.

6.

7.

8.

9.

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() { 10.

11.

12.

} } System.out.println("("+x+","+y+","+color+")"); 1.

2.

3.

4.

5.

6.

7.

8.

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()) 9.

m.setAccessible(true); 10.

11.

{ m.invoke(p1, null); 12.

13.

} }

תיטרפ הטיש תלעפה

.

והשלכ טקייבוא תלבקמ methodCall תיטטסה הטישה לוכיו עודי וניא o רטמרפה לש ) ימנידה ( יתימאה גוסה .

רבד לכ תויהל םשב הטיש שי הז טקייבואל םאה תקדוב תיטטסה הטישה .

םירטמרפ תלבקמ אלש show .

העדוה תגצומ , אל םא .

תלעפומ וז הטיש , ןכ םא התוא הטישה םש תא תלבקמ getMethod הטישה םיטקייבוא םלוכ ( םירטמרפ יגוס לש המישרו , םישפחמ םיריבעמ םירטמרפ תלבקמ אל הטישה םא .) Class גוסמ .

null טקייבואב תאצמנש הטישה תא הליעפמ invoke הטישה תלעופ וילע טקייבואה אוה הלש ןושארה רטמרפה .

m .

הטישל םיטנמוגרא תמישר ינשה רטמרפהו , הטישה        14

םינוש םיגוסמ םיטקייבוא ךרעמ לופכש

Object[] , לשמל .

םינוש םיגוסמ םיטקייבוא ךרעמ ןותנ .

הצרנש גוס לכמ םיטקייבוא קיזחהל לוכי הזכ ךרעמש רורב .

ולש םיטקייבואהמ דחא לכ לופכשו טקייבואכ ךרעמה לופכש , רמולכ .

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

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

ךרעמה לש םיטקייבואה לע רבד םוש םיעדוי אל ונחנאש ונלש אצומה תדוקנ לבא .

הקלחמה היעבה  םיטקייבואה תא תוצקהל שיו תוינפה ךרעמ קר הז , ךא .

שדח םיטקייבוא לש ךרעמ הצקנו ךרעמה לדוג תא קודבנ .

םייתימאה .

ולש metaobject ה תא שקבנ ךרעמב את לכל .

הקתעה יאנב הליכמ טקייבואה לש תירוקמה הקלחמה םא ררבנ metaobject ה ךותמ .

טקייבואה תא לפכשנ ךכבו הז יאנב ליעפנ ןכו הדימב עצבנ ןכלו ןאכ ןהב לפטנ אל ךא ) לשמל Cloning ( דדומתהל ידכ תופסונ תויורשפא טעמ אל תומייק ןיאו הדימב .

ירוקמה טקייבואל הינפה ןורתפ      .

הנתשמ אל ןורתפה ךרד .) דבלב תוטשפה ךרוצל קר ( תורוצ ךרעמ הקיזחמ ןאכ גיצנש המגודה       15

םינוש םיגוסמ םיטקייבוא ךרעמ לופכש

{

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;

16

ךשמה םינוש םיגוסמ םיטקייבוא ךרעמ לופכש

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);

} 17

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

אוה םג רמשנ טקייבוא לכ לש הקלחמה גוס ףסונב .) רחא

18