JavaBeans 是 Java 平台上可重用軟體元件的標準規範。本文系統整理 JavaBeans 核心規格:四大屬性類型、事件模型、客製化機制(Customizer、PropertyEditor、BeanInfo)、持久化與部署格式。
(詳細解析請參考 JavaBean 四大屬性類型深度解析)
java.util.EventObjectjava.util.EventListener,命名以 Listener 結尾// 事件物件
public class MyEvent extends EventObject { ... }
// 監聽器介面
public interface MyListener extends EventListener {
void myEventOccurred(MyEvent e);
}
// 事件源註冊/移除方法
public void addMyListener(MyListener l);
public void removeMyListener(MyListener l);
// 事件觸發(內部實作)
protected void fireMyEvent() {
MyEvent e = new MyEvent(this);
for (MyListener l : listeners) l.myEventOccurred(e);
}
當監聽器介面包含多個方法,但僅需實作其中幾個時,可提供預設空實作的適配器類別:
public class MyAdapter implements MyListener {
public void method1(MyEvent e) {}
public void method2(MyEvent e) {}
public void method3(MyEvent e) {}
}
開發工具生成代碼時常使用匿名內部類別繼承適配器,僅覆寫關心的方法。
為複雜 Bean 提供專屬圖形化設定對話框,實作 java.beans.Customizer 介面:
public class MyBeanCustomizer extends Panel implements Customizer {
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
// 必須實作:讓建構工具監聽屬性變更
public void addPropertyChangeListener(PropertyChangeListener l) { ... }
public void removePropertyChangeListener(PropertyChangeListener l) { ... }
// 建構工具呼叫:設定被客製化的 Bean
public void setObject(Object bean) { ... }
}
為特定屬性提供自訂編輯方式(下拉選單、對話框、字串轉換),繼承 PropertyEditorSupport:
public class ColorEditor extends PropertyEditorSupport {
public String[] getTags() {
return new String[] {"Red", "Green", "Blue"}; // 下拉選單選項
}
public String getAsText() { ... } // 屬性值 → 字串顯示
public void setAsText(String s) { ... } // 字串 → 屬性值
public Component getCustomEditor() { ... } // 回傳自訂編輯元件
public boolean supportsCustomEditor() { return true; }
}
集中描述 Bean 的屬性、方法、事件、圖示等中繼資料,繼承 SimpleBeanInfo:
public class MyBeanInfo extends SimpleBeanInfo {
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor pd = new PropertyDescriptor("color", MyBean.class);
pd.setPropertyEditorClass(ColorEditor.class); // 指定編輯器
return new PropertyDescriptor[] { pd };
} catch (Exception e) { return null; }
}
public Image getIcon(int iconKind) { ... } // 提供 16x16/32x32 圖示
}
java.io.Serializable| 變更類型 | 是否相容 | 說明 |
|---|---|---|
| 新增欄位 | ✅ 相容 | 舊資料反序列化時新欄位為預設值 |
| 移除欄位 | ❌ 不相容 | 導致 serialVersionUID 不符 |
| 修改欄位型別 | ❌ 不相容 | 型別不匹配拋出例外 |
| 改變欄位存取修飾詞 | ✅ 相容 | 不影響序列化格式 |
| 欄位改為 transient/static | ❌ 不相容 | 資料遺失 |