|
バージョン 1.4 での JavaBeansTM Component API の API 拡張 |
JavaBeansTM Component API |
このドキュメントでは、Java 2 Platform, Standard Edition バージョン 1.4 で java.beans パッケージに加えられた変更点について説明します。
長期持続性をサポートする新しい API
長期的な持続性 (long-term persistence) をサポートするために、次のようなクラスが追加されました。
クラス 説明 Statementオブジェクトのメソッド呼び出しを表すオブジェクトで、引数を伴うことがある。例を示します。たとえば、 a.setFoo(b)Expression結果を返す文。例を示します。 a.getFoo().XMLDecoderXMLEncoderを使って作成された XML ドキュメントを読むEncoder持続性委譲を使って、オブジェクトのグラフを、それを再作成する際に使用できる一連の StatementとExpressionに分割するXMLEncoderXML エンコーディングで文と式を生成する EncoderPersistenceDelegateそのオブジェクトのクラスの public メソッドを使用して、他のオブジェクトの状態を表すオブジェクトを定義する抽象クラス DefaultPersistenceDelegateBean に対してデフォルトで使用する持続性委譲 長期的な持続性に関する詳細情報についてのリンクは JavaBeans Component API を参照してください。
その他に追加された API
バージョン 1.4 では次のクラスも追加されました。
クラス 説明 EventHandlerサイズが小さく、持続性スキームで自動的に保存されるイベントリスナーの動的な生成をサポートする ExceptionListener例外がスローされたと通知されるが、その後そこから回復が行われるリスナーを定義する。Bean の読み書き中にオブジェクトが回復可能な問題に直面したときに通知する例外リスナーを、 XMLEncoderまたはXMLDecoderオブジェクトに登録するPropertyChangeListenerProxyPropertyChangeListenerを実装し、固有のプロパティを使用してグループに別のPropertyChangeListener(実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティの変更イベントを実際のイベントハンドラに渡すVetoableChangeListenerProxyVetoableChangeListenerを実装し、固有の制約プロパティを使用してグループに別のVetoableChangeListener(実際のイベントハンドラ) を提供するプロキシ。プロキシはプロパティの変更イベントを実際のイベントハンドラに渡す次のクラスには追加メソッドがあります。
PropertyChangeSupportクラスには、登録されたプロパティ変更リスナーをすべて取得する、引数のないメソッド(getPropertyChangeListeners) が含まれるようになりました。- 同様に、
VetoableChangeSupportクラスには、登録された拒否可能な変更リスナーをすべて取得する、引数のないメソッド(getVetoableChangeListeners) が含まれるようになりました。
Introspector の変更点
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); }
|
Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved. |
Java ソフトウェア |