要說Bean,就得提到Introspection和Reflection,還有“動態”。
一般而言,開發者社群說到動態語言,大致認同的一個定義是:“程序運行時,答應改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。
盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制(其實C++也是這樣的動態機制):Reflection。這個字的意思是“反射、映象、倒影”,用在Java身上指的是我們可以於運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。這種“看透class”的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被並提的兩個術語。Java中的類都有這樣的特點(有時間的話,可以看看Java的Class這個類)。
而JavaBean,首先是JAVA的一個類Class,然後再具有Bean的特點。簡單的說,就是符合一定規范(getter和setter的命名與變量名一致)的類。這樣的類能夠通過Java的reflexion機制,自動獲取屬性的值。常見的就是一些方法的命名getXXX(),setXXX(),一些事件接收者的注冊要遵守一定的規范。
由於JavaBean也是Java的一個Class類,所以JavaBean也有introspection和Reflection的性質。前者Introspection就是類的get和set方法,也就是類設定和獲取自身屬性值的方法。而後者Reflection就是java程序在運行中檢查自己包含對象的能力,即可以在加載對象後獲得對象屬性和方法的名稱,並且通過調用前者獲得一個值。還有一個是Bean的Methode和Interface的命名具有Design Pattern的特點(這個也是可以忽略的。)
bean 提出來的目的是組件化,跟其他程序語言比如 Delphi 中提出的控件是一樣的, 不過它給出了一些規范, 假如大家都遵守了, 就可以使用同一種機制來調用不同的控件。只是為了更方便重用性更強而已,也不是專門為 web service 而提出了。相比之下,GUI類的 bean 跟一般概念上的組件更相象。另外Bean的class比一般的class有許多規范與限制,所以它們的實現機制不一樣。
換句話說,JavaBeans其實就是一般的JAVA代碼片段,只不過是考慮了代碼的重用而變成一些“組件化”了的java程序代碼,且依據一定的模式制作。
JavaBean在本質上和一般的類的確沒差別。但在思想和使用上有些不同。如:JavaBean通過setXXX(),getXXX()等方法提供操作Bean中數據的方法,這樣在Web應用程序開發時,頁面設計者可以不用再和java代碼打交道直接通過Html標簽就可以完成相應數據的操作。這時Bean設計的目的,就在於將頁面設計者和程序開發者隔離。至於重用性,我倒感覺和普通類差別不大。