倭マン's BLOG

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

果たしてそれが(どれが)プロパティなのか? (1) : プロパティの取得方法

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 オブジェクトが指す(メタ)クラスのプロパティになっています。

Groovyイン・アクション

Groovyイン・アクション


The Java(TM) Class Libraries, Volume 2: java.applet,  java.awt,  java.beans (paperback) (2nd Edition) (The Java Class Libraries)

The Java(TM) Class Libraries, Volume 2: java.applet, java.awt, java.beans (paperback) (2nd Edition) (The Java Class Libraries)