倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

JavaBeans 基礎の基礎

JavaBeans とは?


★JavaBeans の定義★

JavaBeans とは Bean と呼ばれるオブジェクトの仕様*1です。 そして、Bean とは、概ね以下の3つの条件を満たす Java クラスのことです:

● 引数のないコンストラクタが定義されている。
● プロパティに対して適切な命名規則に従ったアクセッサ・メソッド*2が定義されている。
シリアライズ可能(java.io.Serializable を実装している)。

プロパティとは、private フィールドだと思ってください。 また、人によっては、「シリアライズ可能」という条件を外している人もいます。 現在では Bean と XML 文書間での入出力が規定されているので*3、基本的にはシリアライズ可能である必要はないかもしれません。

★アクセッサ・メソッドの命名規則★

定義の中の一番大事な項目は、「プロパティに対して適切な名前の getter / setter メソッドが定義されている」です。 命名規則は、文章で説明するより例を示した方が早いかと。

プロパティ名 getter メソッド setter メソッド 備考
name String getName() void setName(String) -
closed boolean isClosed() void setClosed(boolean) boolean 型のプロパティ
favoriteColor String getFavoriteColor() void setFavoriteColor(String) 複数の単語からなるプロパティ名


ちなみに、プロパティの型は文字列やプリミティブ型、別の Bean などにすることが出来ます。

サンプル


後で使う簡単なサンプルを定義しておきましょう。 プロパティは name だけです。

public class Person{

    private String name;

    /** getter メソッド */
    public String getName(){
        return this.name;
    }

    /** setter メソッド */
    public void setName(final String name){
        this.name = name;
    }
}

以下のセクションで、このサンプルを用いて(直接アクセッサ・メソッドを呼び出さずに)Bean とプロパティ名からプロパティの取得、設定を行うサンプルを見ていきます。

java.beans パッケージを使う


基本的な流れは

  1. java.beans.PropertyDescriptor オブジェクトを生成する。
  2. アクセッサ・メソッドを取得する。
  3. 取得したメソッドを実行する。

です。 複数のプロパティを扱いたい場合は、個々のプロパティに対してこれを実行しなければなりません。

/* メソッド内 */

Person person = new Person();

// 1. PropertyDescriptor を取得する。
//    IntrospectionException をキャッチする必要有り。
PropertyDescriptor nameDesc = new PropertyDescriptor("name", Person.class);

// 2. アクセッサ・メソッドを取得する。
//    値を取得する際(getter メソッドが必要な場合)は
//    PropertyDescriptor#getReadMethod() を取得する。
Method setter = nameDesc.getWriteMethod();

// 3. アクセッサ・メソッドを実行する。
//    IllegalAccessException, InvocationTargetException 
//    をキャッチする必要有り
setter.invoke(person, "倭マン");

★1つのクラスに対して複数のプロパティを扱う場合は・・・★

複数のプロパティを扱う場合は、java.beans.BeanInfo オブジェクトを使うと楽になる場合があるかもしれません。 BeanInfo オブジェクトは java.beans.Introspector クラスの static メソッドを使って取得します。

/* メソッド */
public BeanInfo getBeanInfo(final Class<?> beanClass){
  try{
    return Introspector.getBeanInfo(beanClass);
            
  }catch(final IntrospectionException ex){
    // 適切に例外処理を。
    throw new RuntimeException(ex);
  }
}

BeanInfo オブジェクトから、(getPropertyDescriptors() メソッドを使って)その対象となる Bean に定義されている PropertyDescriptor 全てを取得できますが、プロパティ名をキーにしてその PropertyDescriptor オブジェクトを取得出来ないので、チョット使いにくいですね。

次回は Jakarta Commons プロジェクトで開発されている commons-beanutils の基礎の基礎をやりたいと思います。


*1:公式にはこちらを参照。 GUI コンポーネントとしての定義が正式な定義ですが、現在その意味で「JavaBeans」という用語を使っている人がいるのかどうか分かりません。

*2:getter / setter メソッド。

*3:公式にはこちらを参照。