Reflection (תכנות)

במדעי המחשב, reflection (ריפלקשן; מילולית מאנגלית: השתקפות או התבוננות) היא היכולת של תוכנת מחשב לבחון אובייקטים או לשנות את התנהגותם בזמן ריצה. בחינת האובייקטים מבוצעת באמצעות תהליך הנקרא type introspection - "הסתכלות פנימה על טיפוסים", ושינוי ההתנהגות של אובייקטים כוללת את היכולת לשנות ערכים, metadata, תכונות (properties) ופונקציות.

השימוש הנפוץ ביותר ב-reflection הוא בשפות עילית הרצות על גבי מכונה וירטואלית, כדוגמת Smalltalk. כמו כן השימוש ב-reflection נפוץ בשפות תסריט ובשפות בעלות טיפוסיות סטטית כגון: ML, Java, ו-Haskell.

לשפות תכנות התומכות ב-reflection קוראים "שפות רפלקטיביות" (reflective languages). לתכנות הכולל שימוש ב-reflection קוראים "תכנות מונחה-reflection-oriented programming) "reflection).

רקע היסטורי

התכנות של מחשבים מוקדמים בוצע בשפת הסף הטבעית שלהם. שפות סף כאלה הן רפלקטיביות מטבען, מכיוון שהן פועלות על ידי הגדרת ההוראות בצורה של נתונים. פונקציונליות רפלקטיבית כגון שינוי ההוראות או ניתוח שלהן הייתה דבר שבשגרה. כאשר התכנות התקדם לשפות תכנות עיליות יותר כדוגמת שפת C, השימוש ב-reflection נעלם, עד שהופיעו שפות תכנות שמערכת הטיפוסים שלהן כוללת תמיכה ב-reflection.

שימושים

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

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

בנוסף לכך, ניתן להשתמש ב-reflection על מנת לסגל תוכניות למצבים שונים בצורה דינאמית. לדוגמה, נחשוב על יישום המשתמש לסירוגין בשתי מחלקות שונות, X ו-Y, לצורך ביצוע של משימות דומות. בלי תכנות מונחה-reflection, יכול להיות שהיישום יהיה מתוכנת בצורה קשיחה (hard-coded) לקרוא לשמות של מתודות של מחלקה X ומחלקה Y. לעומת זאת, על ידי שימוש בפרדיגמת התכנות מונחה-reflection, ניתן לממש את היישום כך שישתמש ב-reflection כדי לקרוא למתודות במחלקות X ו-Y, מבלי לקודד מראש בצורה קשיחה את שמות המתודות.

על מנת לנצל את היתרונות שבכתיבת קוד גנרי יותר באמצעות תכנות מונחה-reflection, כמעט תמיד נדרשות מומחיות ותשתיות תוכנה נוספות. מידת השימוש ב-reflection קובעת עד כמה ניתן יהיה להימנע משימוש ב-hard coding (קידוד קשיח).

לעיתים קרובות משתמשים ב-reflection בבדיקות תוכנה, כאשר רוצים ליצור מופעים של "אובייקטי דמה" (mock objects) בזמן ריצה.

כמו כן, reflection היא האסטרטגיה הראשית ב-metaprogramming – כתיבת תוכנות מחשב שכותבות או משנות תוכנות אחרות.

מימוש

שפת תכנות הכוללת תמיכה ב-reflection, מספקת מספר שירותים ייעודיים הזמינים בזמן ריצה, שאחרת היו קשים מאוד למימוש בשפה שהיא low-level יותר. בין היתר, שירותים אלו מאפשרים:

  • לגלות ולשנות יחידות קוד (כדוגמת בלוקים של קוד, מתודות, פרוטוקולים, וכדומה) בזמן ריצה, כ"אובייקטים מן השורה" (first-class objects).
  • להמיר מחרוזת המתאימה לשם הסימבולי של מחלקה או פונקציה, לקישור (reference) או קריאה לאותה מחלקה או פונקציה.
  • להעריך מחרוזת בזמן ריצה, כאילו הייתה הצהרה בקוד מקור.
  • ליצור מפרש חדש עבור ה-bytecode של השפה, על מנת לתת משמעות או שימוש חדשים עבור מבנה תכנותי מסוים.

שירותים אלה ניתנים למימוש בדרכים שונות. שפות העוברות הידור מסתמכות על מערכת סביבת ההרצה (runtime) שלהן כדי לקבל מידע אודות קוד המקור. לדוגמה, קובץ הרצה מהודר בשפת Objective-C, שומר את שמות כל המתודות בבלוק בתוך הקובץ, ובכך מספק טבלה להתאמה בין שמות המתודות למתודות עצמן בתוכנית המהודרת.

בשפה מהודרת התומכת ביצירת פונקציות בזמן ריצה, כדוגמת Common Lisp, סביבת ההרצה חייבת לכלול מהדר או מפרש. כמו כן, ניתן לממש reflection גם בשפות שאינן כוללות מנגנונים מובנים לתמיכה ב-reflection, על ידי שימוש במערכת ל-program transformation, כדי להגדיר שינויים אוטומטיים בקוד המקור.

דוגמאות

קטעי הקוד הבאים יוצרים מופע foo של המחלקה Foo, ואז קוראים למתודה hello. עבור כל שפת תכנות, מוצגות הקריאות הרגילות וגם הקריאות שעושות שימוש ב-reflection.

// Using Java package: java.lang.reflect

// Without reflection
new Foo().hello();

// With reflection
Class<?> clazz = Class.forName("Foo");
clazz.getMethod("hello").invoke(clazz.newInstance());
// Without reflection
new Foo().hello()

// With reflection

// assuming that Foo resides in this
new this['Foo']()['hello']()

// or without assumption
new (eval('Foo'))()['hello']()

// or simply
eval('new Foo().hello()')
// without reflection
$foo = new Foo();
$foo->hello();

// with reflection
$reflector = new ReflectionClass('Foo');
$foo = $reflector->newInstance();
$hello = $reflector->getMethod('hello');
$hello->invoke($foo);

// using callback
$foo = new Foo();
call_user_func(array($foo, 'hello'));

// using variable variables syntax
$className = 'Foo';
$foo = new $className();
$method = 'hello';
$foo->$method();
# without reflection
obj = Foo.new
obj.hello

# with reflection
class_name = "Foo"
method = :hello
obj = Kernel.const_get(class_name).new
obj.send method
// Foo class
@interface Foo : NSObject
- (void)hello;
//...
@end

// without reflection
Foo *obj = [[Foo alloc] init];
[obj hello];

// with reflection in OPENSTEP, loading class and call method using variables.
NSString *className = @"Foo";
SEL selector = @selector(hello);
id obj = [[NSClassFromString(className) alloc] init];
[obj performSelector:selector]; // This will emit an warning when compiling with Objective-C ARC.

ראו גם

קישורים חיצוניים

Read other articles:

Pour les articles homonymes, voir Jones. Cet article est une ébauche concernant un musicien britannique. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Jax JonesBiographieNaissance 25 juillet 1987 (36 ans)LondresNom de naissance Timucin Fabian Kwong Wah AluoPseudonymes Timz Aluo, Jax JonesNationalité britanniqueActivités Disc jockey, auteur-compositeur, DJ producer, producteur de disques, compositeur, m...

 

Prof. dr.Jurnalis UddinPAK.Lahir10 Juli 1937 (umur 86)Sulit Air, Solok, Sumatera Barat, Hindia BelandaKebangsaanIndonesiaAlmamaterUniversitas Gadjah MadaUniversitas IndonesiaPekerjaanAhli kesehatan, pengajarDikenal atasPendiri Yayasan YARSISuami/istriZoraida Jurnalis Jurnalis Uddin (lahir 10 Juli 1937) adalah seorang ahli kesehatan dan pengajar Indonesia. Ia bersama beberapa orang koleganya, seperti Asri Rasad, merupakan pendiri Yayasan YARSI yang mengelola beberapa lembaga pendidikan d...

 

Ini adalah nama Tionghoa; marganya adalah Zhou. Zhou ZhennanNama asal周震南Lahir21 Juni 2000 (umur 23)Chongqing, TiongkokNama lainRap大白 (Rap dà bá) 阿南 (Anan) 南南 (Nannan)PendidikanSekolah Internasional Meishi ChengduPekerjaanRapperpenyanyipenaripemandu acarapenulis laguKarier musikGenreMandopopHip hopInstrumenVokalTahun aktif2017–sekarangLabelWajijiwa EntertainmentArtis terkaitR1SE Zhou Zhennan Hanzi tradisional: 周震南 Hanzi sederhana: 周震南 Alih aksar...

Hiking trail in Denmark ØhavsstienLength220 km (140 mi)LocationSouthern Funen, DenmarkTåsinge, Langeland, ÆrøEstablished2007[1]UseHikingDifficultyeasy walkWaymarkwhite pictogram on blueHazardsLily of the valleySurfacenatural pathsWebsitedetsydfynskeoehav.dk Øhavsstien (English: Archipelago Trail) is one of the longest hiking trails in Denmark. The trail goes through the South Funen Archipelago, along southern regions of Funen, as well as the islands of Tåsinge, Langela...

 

Danau MuickDanau Muick dari pesisir timur, menghadap baratLetakAberdeenshire, SkotlandiaKoordinat56°55′59″N 3°10′13″W / 56.93306°N 3.17028°W / 56.93306; -3.17028Koordinat: 56°55′59″N 3°10′13″W / 56.93306°N 3.17028°W / 56.93306; -3.17028[1]Jenis perairandanau air tawarAliran masuk utamaAllt an Dubh loch[2]Aliran keluar utamaSungai MuickTerletak di negaraSkotlandiaPanjang maksimal225 mi (362 km) ...

 

American diplomat For other people named Thomas Miller, see Thomas Miller (disambiguation). Thomas J. Miller, 2002 Thomas Joel Miller (born December 9, 1948)[1] is an American diplomat and three-time U.S. ambassador who served from 2010 until 2018 as president/CEO of International Executive Service Corps (IESC). IESC is a 50-year-old non-profit started by David Rockefeller and other prominent American businesspeople focusing on creating prosperity and stability through private enterpr...

Munisipalitas di Minas Gerais, Brasil Berikut ini adalah daftar dari munisipalitas negara bagian di Minas Gerais (MG), Brasil. Mesoregion Microregion Munisipalitas Campo das Vertentes Barbacena Alfredo Vasconcelos Antônio Carlos Barbacena Barroso Capela Nova Caranaíba Carandaí Desterro do Melo Ibertioga Ressaquinha Santa Bárbara do Tugúrio Senhora dos Remédios Lavras Carrancas Ijaci Ingaí Itumirim Itutinga Lavras Luminárias Nepomuceno Ribeirão Vermelho São João del Rei Conceição ...

 

Jalanan utama di Gherla Gherla (bahasa Hungaria: Szamosújvár, bahasa Armenia: Hayakaghak, bahasa Jerman: Neuschloss) ialah sebuah kota di Provinsi Cluj, Transilvania, Rumania. Kota ini terletak 45 km dari Cluj-Napoca di Sungai Someşul Mic, anak Sungai Tisza bagian timur. Kota ini berpenduduk 24.083 jiwa pada tahun 2002, di mana 19.243 (79,9%) adalah orang Rumania, 4.086 (17%) orang Hungaria, 657 (2,7%) orang Rom dan 97 adalah sisa-sisanya, dengan 31 jiwa orang Armenia dan 30 penutur b...

 

Qurayn Abu al BawlTuwayyir al HamirFar view of the hill from Qatar-UAE RoadHighest pointElevation103 m (338 ft)ListingCountry high pointCoordinates24°43′04″N 51°02′51″E / 24.71778°N 51.04750°E / 24.71778; 51.04750[1]NamingNative nameقرين أبو البول (Arabic)GeographyQurayn Abu al BawlLocation in QatarShow map of QatarQurayn Abu al BawlLocation in the Persian GulfShow map of Persian Gulf LocationQatarGeologyMountain type...

LARESLARES satelliteMission typeLaser ranging satelliteTests of general relativity[1][2]OperatorItalian Space Agency (ASI)COSPAR ID2012-006A SATCAT no.38077Websitehttp://www.lares-mission.com/Mission durationLARES 1: 12 years, 2 months and 21 days (elapsed) LARES 2: 1 year, 9 months and 20 days (elasped) Spacecraft propertiesManufacturerCarlo Gavazzi SpaceLaunch mass386.8 kgDimensions36.4 cm (diameter) Start of missionLaunch date13 February 2012,...

 

Wilhelm Frick Wilhelm Frick en 1938 Reichsminister de Interior 30 de enero de 1933-24 de agosto de 1943Presidente Paul von Hindenburg (1933-1934)Adolf Hitler (1934-1943, como Führer)Canciller Adolf HitlerPredecesor Franz BrachtSucesor Heinrich Himmler Reichsprotektor de Bohemia y Moravia 24 de agosto de 1943-4 de mayo de 1945Designado por Adolf HitlerPresidente Adolf HitlerCanciller Adolf HitlerPredecesor Konstantin von Neurath (de jure)Kurt Daluege (de facto)Sucesor cargo abolido Informaci�...

 

Ministerio de Desarrollo Urbano y Vivienda MIDUVI LocalizaciónPaís EcuadorInformación generalJurisdicción Ecuador EcuadorTipo Ministerios de EcuadorSede Quito: Av. 10 de agosto de 2270 y Luis CorderoOrganizaciónMinistros María Gabriela Aguilera JaramilloDepende de Ministerio Coordinador de Desarrollo SocialHistoriaFundación 1992Sitio web oficial[editar datos en Wikidata] El Ministerio de Desarrollo Urbano y Vivienda de Ecuador es la cartera de Estado encargada de ej...

Flanking towers of Château de Coucy Flanking towers of Giebichenstein Castle A flanking tower is a fortified tower that is sited on the outside of a defensive wall or other fortified structure and thus forms a flank. From the defensive platform and embrasures the section of wall between them (the curtain wall) could be swept from the side by ranged weapons. In High and Late Medieval castles and town walls, flanking towers often had a semi-circular floor plan or a combination of a rectangular...

 

福州脱胎漆器 脫胎漆器,又稱活脫,指不依賴內胎、僅僅依靠漆層和填充的織物成型的一種漆器。廣義的脫胎漆器可以指一切應用此種工藝的漆器,因為最常用的填充織物是苧麻的麻布,又稱夾紵。狹義的脫胎漆器指福建省福州市特產的,以絲綢替代麻布、進一步減輕自重的漆器。 夾紵在日本則被叫做乾漆造,是一種在漆器製作的技法,始於戰國時代的楚國,於漢朝逐漸成...

 

You can help expand this article with text translated from the corresponding article in Hungarian. (December 2009) Click [show] for important translation instructions. View a machine-translated version of the Hungarian article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simply copy-pasting machine-translated text into the English...

Mario BrunelloMario Brunello nel 2003 Nazionalità Italia GenereMusica classica, barocca, jazz, contemporanea Periodo di attività musicale1986 – in attività Strumentovioloncello EtichettaEgea Records Sito ufficiale Modifica dati su Wikidata · Manuale Mario Brunello (Castelfranco Veneto, 21 ottobre 1960) è un violoncellista italiano. Indice 1 Biografia 2 Discografia 3 Note 4 Voci correlate 5 Altri progetti 6 Collegamenti esterni Biografia Ha studiato al Conse...

 

南達科他州參議院南達科他州議會(英语:South Dakota Legislature)南達科他州州徽种类种类上議院连任限制4屆(8年)历史当前任期2021年1月12日领导議長賴瑞·羅登(英语:Larry Rhoden)( 共和黨) 自2019年1月5日臨時議長李·舍恩貝克(英语:Lee Schoenbeck)( 共和黨) 自2021年1月8日多數黨領袖蓋瑞·卡馬克(英语:Gary Cammack)( 共和黨) 自2021年1月8日少數黨領袖特洛伊·海納特...

 

This article is about the modern municipality and city. For the pre-Columbian city-state, see Texcoco (altepetl). For the lake, see Lake Texcoco. City in State of Mexico, MexicoTexcoco de MoraCityPart of the main plaza SealTexcoco de MoraLocation in MexicoCoordinates: 19°30′32″N 98°52′55″W / 19.509°N 98.882°W / 19.509; -98.882Country MexicoStateState of MexicoMunicipalityTexcocoFounded1551 (as Spanish city)Municipality Created1919Government •...

希腊历史 历史系列条目 新石器时代希腊 新石器时代希腊 青铜时代希腊 希臘文明 基克拉泽斯文明 米诺斯文明 迈锡尼文明 古希腊 黑暗时期 古風時期 古典时期 希腊化时期 中世纪希腊 罗马时期 拜占庭希腊(英语:Byzantine Greece) 法兰克和拉丁统治 奥斯曼希腊(英语:Ottoman Greece) 威尼斯統治(英语:Stato da Màr) 近现代希腊 塞普丁修拉共和国 独立战争 希臘王國 国家分立�...

 

Canton de Flers-Nord Situation du canton dans l'arrondissement d'Argentan (hors Flers). Administration Pays France Région Basse-Normandie Département Orne Arrondissement(s) Argentan Circonscription(s) 3e Chef-lieu Flers Code canton 61 15 Histoire de la division Création 1982 Disparition 2015 Démographie Population 13 859 hab. (2012) Géographie Coordonnées 48° 47′ 18″ nord, 0° 35′ 02″ ouest Subdivisions Communes 7 modifier  Le canto...