今天心血來潮想了解一下Java反射機制的歷史。想知道JDK的設計者們,是在怎么樣的場景下,從語言的層面加入了這一特性。而它又是怎么樣一步步演化成今天的樣子的。
一個事物的初衷和它最后的用途,可能相去甚遠。就好像矩陣被海森堡用于量子力學,但是最初被數學家發(fā)明出來的時候,其實是為了解方程組。
一開始我以為這類文章應該一搜一大把,無奈不管谷歌百度,大部分都是以“現代”視角來寫的。只挖到一篇題為《Using Java Reflection》[1]的文章,顯示的時間戳是“January 1998”,年份夠陳(反射是1997年發(fā)布的JDK 1.1中引入的 [2]),那就從它入手吧。
文章中提到:
One tangible use of reflection is in JavaBeans, where software components can be manipulated visually via a builder tool. The tool uses reflection to obtain the properties of Java components (classes) as they are dynamically loaded.
大意是,工具可以通過反射來獲取Java組件(類)的屬性。
說實話對于沒用過JavaBeans的人來說,光看這樣的解釋還是不能理解。
再翻翻它的老底吧。
參考Wikipedia上的定義[3],又看到了這樣一句話:
It is a reusable software component written in Java that can be manipulated visually in an application builder tool.
同樣是“be manipulated visually”,跟之前的文章簡直如出一轍。在最后一節(jié)中有一個外鏈教程。終于在《A Button is a Bean》[4]中,我們看到了:

標題很直白:Button是一個Bean。同時,在構建工具(build tool)中,按鈕的屬性又可以通過反射可以取得,比如圖中所示的文本、圖標。
至此,應該算是把引入反射的原因理清楚了:為了能可視化的把一個類的屬性展示給編寫B(tài)ean的用戶。