JavaBean 本質上是遵循特定命名慣例的普通 Java 類別。其「組件化」特性源自 Java 的 反射 與 內省 機制,使工具能在運行時動態發現並操作 Bean 的屬性、方法與事件。
Java 程式在運行時檢查類別結構 (欄位、方法、建構子、註解) 並動態調用的能力。java.lang.Class 是入口,java.lang.reflect 套件提供操作 API。
Class.forName("com.example.Foo")clazz.getDeclaredConstructor().newInstance()Field.setAccessible(true); field.set(obj, value)Method.invoke(obj, args)針對 JavaBean 慣例的高層封裝,自動識別 getX/setX 為屬性、addXListener/removeXListener 為事件。核心類別:java.beans.Introspector、PropertyDescriptor、EventSetDescriptor、MethodDescriptor。
BeanInfo info = Introspector.getBeanInfo(MyBean.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
Method getter = pd.getReadMethod();
Method setter = pd.getWriteMethod();
// 工具自動產生屬性表、綁定 UI
}
| 規範項目 | 要求 | 目的 |
|---|---|---|
| 類別 | public、具無參建構子、實作 Serializable | 工具實例化、持久化 |
| 屬性 | getX()/setX() 命名一致、型別匹配 | 內省自動識別、屬性表編輯 |
| 布林屬性 | 可用 isX() 替代 getX() | UI 呈現核取方塊 |
| 索引屬性 | getX(int)/setX(int, val) 重載 | 陣列/集合元素編輯 |
| 事件 | addXListener/removeXListener + Listener 介面 | 設計工具連線連結 |
| 方法 | public 非 static/final | 設計工具調用、BeanInfo 描述 |
<jsp:useBean>、EL ${bean.prop}),不接觸 Java 代碼。Java 屬靜態類型語言 (編譯期決定型別),但反射/內省提供了「運行時型別發現與操作」的動態特性,彌補了靜態語言的剛性。Groovy、Kotlin 等 JVM 動態語言更進一步簡化了 Bean 操作語法。
JavaBean = 普通 Class + 命名慣例 + Serializable。反射提供「看透類別」的底層能力,內省在其上建立「理解 Bean 慣例」的高層抽象。兩者結合賦予 Java 組件化、工具化、框架化的生態基石。