4.Beansの本質(Introspection,Core Reflection,BeanInfo)
JavaBeansは1996年のJavaOneで発表されていますので、既に3年も経過した技術です。しかしながら当初私はこれが何なのか良く理解できませんでした。いわゆる部品化の技術らしいとは認識していたものの、じゃあ一般のクラスライブラリと何が違うのかが判りませんでした。
JavaBeansはコンポーネントである。これ自身は正しい認識ですが、どういうコンポーネントなのかが理解出来るようになったのは、98年になっていわゆるビジュアル系の開発ツールを使うようになってからです。つまりJavaBeansとはビジュアル開発ツールのパレット上に配置して、貼付けする事が出来るコンポーネントであると言う事です。ボタンやテキストフィールド等のグラフィクスコンポーネントと同様に、ユーザー自身が作成したものをパレット上に配置出来るコンポーネント、これがJavaBeansの実体です。
BeansFlavor http://www.bekkoame.or.jp/~sakamo_m/BeansFlavor/
Beansを日本語でやさしく解説してくれるホームページです。作者の坂本衛氏はオーム社から「JavaBeansプログラミング入門」を出版しているのですが、当ページはその本のWebSite版と言うことが出来ます。ozawaがヘタな解説するより、このページで学習する方がよほど良いと思います。
BDK1.0 http://splash.javasoft.com/beans/index.html
ソースコードを読むことがいちばん勉強になるという方にお勧めの本家Sunページ。
JavaBeans API specification http://splash.javasoft.com/beans/spec.html
仕様書です。英語に自信のある方に最適です。
JavaBeansが如何なるものか理解するには、とにかく作って見る事が一番てっとり早いと考えます。Sun社はJavaの開発キットとしてJDKをリリースすると共に、Beans用のBDK(JavaBeans Development Kit)も無償で提供しています。とにかくタダが良いとする方はこれが良いでしょうが、ozawaとしてはSymantec社のVisual Cafeで作る事としました。JBuilderの方がBeans関係は良いとする声も聞くのですが、要は持っていないのです。
Visual Cafeではversion2.5でBeansのWizardが強化されていますので、このバージョンで説明します。Wizardを選ぶとまず説明の画面が出ますが、これによれば作成手順は(1)クラスの特定 (2)オーバーライドするメソッドの特定 (3)プロパティの追加となります。
(1) クラスの特定
- Beansの名称とパッケージ名を指定します。
- Beansタイプを { シングル、コンポジット、コンテナ、不可視、カスタム } の中から選択します。
- Beansウェイトを { ライトウェイト、ヘビーウェイト } から選択します。
(2) オーバーライドするメソッドの特定
- オーバーライドする必要のあるクラスをリストから選択します。
(3) プロパティの追加
- プロパティつまりはメソッド内で定義する仮想変数を追加します。
- アイコンの設定をします。16x16 と 32x32 でカラーと白黒が必要ですが、取敢えずカラーだけでも問題ないようです。このアイコンが最終的にはパレットに載ります。
とここまでが作成手順で示されたもので大枠は終わりです。しかし実際のBeansでは動きを加えるなどする訳で、これはEventListenerのコーディングが必要です。Visual Cafeで言うと「関連付け」で殆ど自動的に生成してくれます。最終的にBeansが出来たならばJARファイルを作成します。JARファイル化するともうパレットに載せる事が出来ます。Visual Cafeのコンポーネントライブラリを操作してパレットに登録してみて下さい。
4.Beansの本質(Introspection,Core Reflection,BeanInfo)
さて、前節のようにBeansを作成してみると、ビジュアルコンポーネントがいとも簡単に出来るので驚いてしまいます。ではこれはどうやって実現されているのでしょうか? それはJavaのclass内の命名規則とIntrospection,Core Reflection,BeanInfoといったキーワードに秘密が隠されています。
例えばVisual CafeでozawaというBeansを作るとozawaBeanInfo.classを自動生成します。このBeanInfo型のオブジェクトの中にコンポーネントとして再利用する際に必要な情報が格納されます。このBeanInfoオブジェクトを探し出すのはjava.beansパッケージに含まれるIntrospectorクラスの役目です。IntrospectionとはJavaBeansと開発環境側での情報交換の規則の事です。IntrospectorクラスはBeanInfoオブジェクトが用意されていない場合でも「get<プロパティ名>」、「set<プロパティ名>」というメソッドのペアを見つけ出した上解析します。このペアを見つけるとプロパティとして認識するのです。このように、プログラム自身の情報を、操作の対象たるデータであるかのように扱う必要があるわけですが、このための機構が、Reflectionです。Core ReflectionはIntrospectionに対する下位のAPIとなります。
既にベンダーから既製のBeansが提供されています。今後も有償・無償のBeansが多く提供されて来ると考えられます。これらを自らが作ろうとするシステムに合せて選択するか、或いはオルジナルのものを新たに開発するかです。ビジュアルツールを使えばBeansの開発に要する労力は大きくはないので、既製のBeansではフイットしないと言うことであれば、新規に開発する事も選択肢の一つとなります。是非有用なBeansの開発にチャレンジしてみて下さい。
Beansの場合、個々のbeanがEvent Source、そしてEvent Listenerになる事が出来ます。イベントが発生すると、そのイベントに関する情報を、イベントオブジェクトに詰め込んで、Listener beanのメソッドに引き数として渡します。そして、このイベントオブジェクトを受け取ったListener beanのメソッドは、事前設定されたアクションを行います。
たとえばBDKで有名なJuggler bean(簡単なアニメーションbeanで、startとstopというメソッドを定義してある)に、ExplicuitButton beanからマウスで線を引っ張ることで、結合することができますが、ExplicitButton beanとJuggler beanのソースコードを眺めてみるとExplicitButton beanは、JugglerのActionListenerのインターフェースを実装していません。それに、ActionListenerとして登録したとしても、実行されるのは、JugglerのactionPerformedメソッドのはずであり、startやstopメソッドが呼ばれるはずはありません。が、マウスドラッグでExplicitButton beanをJuggerのstartメソッドのところにつなぐことができ、しかもExplicitButtonをクリックすると、Jugglerが動き出します。これは、BeanBoxがReflectionを使って、ExplicitButtonとJugglerのメソッドを解析し、そのインターフェースミスマッチを解消するアダプタークラスを実行時に自動生成していることにより実現されています。
前ページに戻る---> RETURN