Can you summarize the following document?
        
  反射用於觀察並修改程式在執行時的行為。一個面向反射的(reflection-oriented)程式元件可以監測一個範圍內的程式碼執行情況,可以根據獲取的目標物件資訊及與此相關的範圍修改自身。這可通過在執行時動態分配程式程式碼實現。  在型別檢測嚴格的物件導向的程式語言如Java中,一般需要在編譯期間對程式中需要呼叫的物件的具體型別、介面、欄位和方法的合法性進行檢查。反射技術則允許將對需要呼叫的物件的資訊檢查工作從編譯期間推遲到執行期間再現場執行。這樣一來,可以在編譯期間先不明確目標物件的介面名稱、欄位(fields,即物件的成員變數)、可用方法,然後在執行根據目標物件自身的資訊決定如何處理。它還允許根據判斷結果進行例項化新物件和相關方法的呼叫。  反射主要用途就是使給定的程式動態地適應不同的執行情況。利用物件導向建模中的多型性也可以簡化編寫分別適用於多種不同情形的功能程式碼,但是反射可以解決多型性並不適用的更普遍情形,從而更大程度地避免硬編碼(即把程式碼的細節“寫死”,缺乏靈活性)的程式碼風格。  反射也是超程式設計的一個關鍵策略。

  考慮一個物件導向風格的應用程式,它可以分別使用功能類X、功能類Y、功能類Z來執行相似的操作。如果事先建立並傳遞給它的工具是類A的例項,它就呼叫類A例項具有的方法完成功能;如果事先建立的是類B的例項,它就呼叫類B例項具有的方法完成功能,如果事先建立的是類C的例項,它就呼叫類C例項完成功能。如果它們完成相似功能的方法名稱都相同,或方法都繼承自同一個父類並實現了多型性,那麼只需呼叫名稱唯一的目標方法即可,問題已經解決;如果這些條件並不滿足,我們碰到的問題變成要根據情況從不同物件中呼叫名稱上存在區別、功能卻相似的方法,此時只能分別判斷3種不同情況然後挨個進行硬編碼,或者考慮使用更優雅的反射技巧。分別判斷並硬編碼的做法是:在主程式中對不同的功能類進行差異化對待,在執行主程式的時候判斷當前可用的工具是不是類A的例項,如果是就以明確“指名道姓”的方式呼叫它的特定方法,如果不是就繼續判斷可用的工具是不是類B的例項,如果是就呼叫B的特定方法,如果也不是就將其視為類C的例項並呼叫對應的方法。如果可能的型別更多的話,就需要寫更多的條件分支語句。然而,如果使用反射式的程式設計技術,應用程式可以在只寫出主要流程、但不寫死具體方法名稱的情況下,在執行時期靈活地獲取可用的目標物件資訊,根據目標方法的大致特徵自動識別和呼叫需要的方法,並自動呼叫目標物件的對應方法解決問題。

  早期計算機的原生組合語言本質上就具有反射特性。因為它是由定義程式設計指令作為資料,如動態修改指令或對它們進行分析等等的反射功能是很平常的。程式設計發展到如C語言等高抽象層次的語言時,這種實踐消失了,帶有反射特性的高階程式語言要到更晚的時候才出現。  1982年,布萊恩·史密斯(Brian Cantwell Smith)在其博士論文《程式語言中的步驟式反射》("Procedural Reflection in Programming Languages")中介紹了“程式語言的計算反射”概念,並且引入meta-circular直譯器的概念用作3-Lisp的一個組成部分。

  

  支援反射的語言提供了一些在早期高階語言中難以實現的執行時特性。

  通過深入學習反射的特性和技巧,它的劣勢可以儘量避免,但這需要許多時間和經驗的積累。
在計算機學中,反射(英語:reflection)是指計算機程式在執行時(英語:runtime)可以訪問、檢測和修改它本身狀態或行為的一種能力。用比喻來說,反射就是程式在執行的時候能夠“觀察”並且修改自己的行為。