Groovy を使ってると「プロパティ」って凄く便利ですが、最近、どれがプロパティとして認識されるのかが(拙者の中で)ゴッチャ煮なってきたなう。 自分でクラスを設計する分には、分かりづらい定義を避ければいいんでしょうけど、既にある(Java) ライブラリを使う際には悩んでしまうことがよくあるので、ここら辺でチョット整理を敢行。
今回は準備として、プロパティの取得方法を見ていきます。
考えるプロパティ
ここで考えるプロパティは次の4つ:
- GroovyBeans のプロパティ (インスタンスから取得)
- groovy.inspect.Inspector クラスを介して取得できるプロパティ (インスタンスから取得)
- JavaBeans のプロパティ (Class オブジェクトから取得)
- MetaClass を介して取得できるプロパティ (MetaClass オブジェクトから取得)
他にも「プロパティ」って感じのものあったっけ? まぁ、とりあえず今回はこの4つで。
以下で、それぞれの方法の簡単なサンプルを見ていきます。
GroovyBeans のプロパティ
まずは「GroovyBeans」としてのプロパティ。 Groovy では一番よく使うのはこれでしょうか。 あるクラス SomeObject のインスタンスに対して、その「プロパティ名のセット」を取得するサンプルコードは以下のようになります:
def obj = new SomeObject() def propNames0 = obj.properties.collect{ prop -> prop.key }
ちなみに「obj.properties」の代わりに「obj.getProperties()」としても同じ結果が得られます(よね?)
この方法では、プロパティの取得にインスタンスが必要となります。
groovy.inspect.Inspector クラスを介して取得できるプロパティ
次は「groovy.inspect.Inspector」を介して取得できるプロパティ。 正直、あんまり使ったことないので、使い方があってるのかどうか分かりません:-) SomeObject オブジェクトに対して、その「プロパティ名のセット」を取得するサンプルコードは以下のようになります:
import groovy.inspect.Inspector def obj = new SomeObject() def props1 = new Inspector(obj).getPropertyInfo().collect{ info -> info[Inspector.MEMBER_NAME_IDX] }
ちなみに「obj.properties」の代わりに「obj.getProperties()」としても同じ結果が得られます(よね?)
この方法でも、プロパティの取得にインスタンスが必要となります。
JavaBeans のプロパティ
続いて「JavaBeans」のプロパティ。 これは Groovy は関係なく、java.beans.Introspector クラスを介して取得するプロパティです。 SomeObject クラスの「プロパティ名のセット」は以下のようにして取得します(サンプル自体は Groovy で書いてます):
import java.beans.Introspector import java.beans.PropertyDescriptor def type = SomeObject.class def beanInfo = Introspector.getBeanInfo(type) def propNames1 = beanInfo.propertyDescriptors.collect{ prop -> prop.name }
この方法では、プロパティの取得に Class クラスのみが必要で、インスタンスを生成する必要はありません。
MetaClass を介して取得できるプロパティ
最後は「MetaClass」を介して取得するプロパティ。 この方法では、GroovyBeans プロパティの場合と違って、インスタンスを生成せずにプロパティを取得することが出来ます。 サンプルコードは以下のようになります:
def metaType = SomeObject.metaClass def metaClassProps = metaType.properties.collect{ prop -> prop.name }
ここでも、GroovyBeans の場合と同じように「metaType.properties」の代わりに「metaType.getProperties()」とできます(よね?) MetaClass オブジェクトに関しては、「properties」プロパティが返すのは、その MetaClass のプロパティではなく、その MetaClass オブジェクトが指す(メタ)クラスのプロパティになっています。
- 作者: Dierk Konig,Andrew Glover,Paul King,Guillaume Laforge,Jon Skeet,杉浦孝,櫻井正樹,須江信洋,関谷和愛,佐野徹郎,寺沢尚史
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 146回
- この商品を含むブログ (121件) を見る
- 作者: Patrick Chan,Rosanna Lee
- 出版社/メーカー: Prentice Hall
- 発売日: 2010/07/12
- メディア: ペーパーバック
- クリック: 1回
- この商品を含むブログ (1件) を見る