このドキュメントでは、Java 2 Platform, Standard Edition バージョン 1.4 で java.beans パッケージに加えられた変更点について説明します。
長期的な持続性 (long-term persistence) をサポートするために、次のようなクラスが追加されました。
クラス | 説明 |
---|---|
Statement |
オブジェクトのメソッド呼び出しを表すオブジェクトで、引数を伴うことがある。たとえば、 a.setFoo(b) . |
Expression |
結果を返す文。たとえば、 a.getFoo() . |
XMLDecoder |
XMLEncoder を使って作成された XML ドキュメントを読む。 |
Encoder |
持続性委譲を使って、オブジェクトのグラフを、それを再作成する際に使用できる一連の Statement と Expression に分割する。 |
XMLEncoder |
XML エンコーディングで文と式を生成する Encoder 。 |
PersistenceDelegate |
そのオブジェクトのクラスの public メソッドを使用して、ほかのオブジェクトの状態を表すオブジェクトを定義する抽象クラス。 |
DefaultPersistenceDelegate |
Bean に対してデフォルトで使用する持続性委譲。 |
長期的な持続性に関する詳細情報についてのリンクは「JavaBeans Component API」を参照してください。
バージョン 1.4 では次のクラスも追加されました。
クラス | 説明 |
---|---|
EventHandler |
サイズが小さく、持続性スキームで自動的に保存されるイベントリスナーの動的な生成をサポートする。 |
ExceptionListener |
例外がスローされたと通知されるが、その後そこから回復が行われるリスナーを定義する。Bean の読み書き中にオブジェクトが回復可能な問題に直面したときに通知する例外リスナーを、XMLEncoder または XMLDecoder オブジェクトに登録する。 |
PropertyChangeListenerProxy |
PropertyChangeListener を実装し、固有のプロパティーを使用してグループに別の PropertyChangeListener (実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティーの変更イベントを実際のイベントハンドラに渡す。 |
VetoableChangeListenerProxy |
VetoableChangeListener を実装し、固有の制約プロパティーを使用してグループに別の VetoableChangeListener (実際のイベントハンドラ) を提供するプロキシ。プロキシは拒否可能なプロパティーの変更イベントを実際のイベントハンドラに渡す。 |
次のクラスには追加メソッドがあります。
PropertyChangeSupport
クラスには、登録されたプロパティー変更リスナーをすべて取得する、引数のないメソッド getPropertyChangeListeners
が含まれます。VetoableChangeSupport
クラスには、登録された拒否可能な変更リスナーをすべて取得する、引数のないメソッド getVetoableChangeListeners
が含まれます。Introspector
クラスが再実装され、パフォーマンスが改善されました。新しく実装されることで、Introspector クラスの動作が次のように変更されました。
FeatureDescriptor
は、BeanInfo
が返されるときにコピーされるのではなく、BeanInfo
ごとに共有されるようになりました。この変更により、getBeanInfo
メソッドのパフォーマンスが向上します。また、FeatureDescriptor
の属性/値が変化すると、その変化は、BeanInfo
がガベージコレクトされるまで getBeanInfo
の呼び出しの間で持続します (BeanInfo
のガベージコレクションについては、「ガベージコレクションとカスタム属性」を参照してください)。getBeanInfo
メソッドは、要求された BeanInfo
のコピーを作成しなくなりました。代わりに、BeanInfo
をキャッシュに保存してから返します。必要であれば、返された BeanInfo
に参照を保存し、flushFromCaches
メソッドでイントロスペクタのキャッシュから Bean のクラスをフラッシュして、以前の動作を得ることができます。instantiate
メソッドで、兄弟ウィジェットまたはブートストラップクラスローダーを使う特定のクラスをインスタンス化できない場合、現在のスレッドのクラスローダーを使うクラスをロードしようとします。v 1.4 では、BeanInfo
が直接参照されていない場合にシステムのメモリーが不足したときは、BeanInfo をガベージコレクトできます。これは、BeanInfo
を SoftReference
にラップすることで Introspector
に実装されています。
ガベージコレクトされる可能性があるため、BeanInfo
内にカスタム属性を格納する方法も変わってきます。特定の BeanInfo
がガベージコレクトされた場合、次に Introspector.getBeanInfo
を呼び出してこの BeanInfo
を取得するとき、返されるオブジェクトにカスタム属性が含まれなくなります。
この問題を避けるために、BeanInfo
内にカスタム属性を格納する場合は、BeanInfo
を取得するたびに、必ずこれらの属性を設定して BeanInfo
を正しく初期化するようにしてください。次のサンプルコードは、Bean 記述子のカスタムプロパティーを設定して BeanInfo
クラスを初期化する方法を示しています。プロパティー記述子、メソッド記述子、またはイベントセット記述子のカスタム属性についても、このコードと同様になります。
BeanInfo beanInfo = getBeanInfo(SomeBean.class); BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor(); /* * Before using the BeanInfo, check to see if our custom * property has been initialized. (Even if we initialized * it before, if the BeanInfo has been garbage collected, * then we need to initialize it again.) Since our custom * property's value could be null, we define another property * to tell us if the custom property is initialized. */ if (beanDescriptor.getValue("myProperty_init") == null) { beanDescriptor.setValue("myProperty", someValue); beanDescriptor.setValue("myProperty_init", Boolean.TRUE); }