2011-07-23 14 views
2
public class foo 
{ 
    private String _name; 
    private String _bar; 

    public String getName() { 
     return _name; 
    } 

    public void setName(String name) { 
     _name = name; 
    } 

    public String getBar() { 
     return _bar; 
    } 

    public void setBarn(String bar) { 
     _bar = bar; 
    } 
} 

上記のクラスを持っていれば、リフレクションを使ってゲッターとセッターで定義されたプロパティをリストできますか?私は以下の方法を試しましたが、うまくいきません。Field[] fieldsは空のままです。私は.Netでこれを行うことができますが、Javaは非常に異なる動物です。間違った木をまもっているのですか?Java Reflection - クラスのプロパティ(ゲッターとセッター)をリストする

private HashMap<String, String> getHashMap(Object obj) { 
    HashMap<String, String> map = new HashMap<String, String>(); 

    Class<?> cls = obj.getClass(); 

    Field fields[] = cls.getFields(); 
    for(Field f : fields) { 
     String name = f.getName(); 
     String value = f.get(obj).toString(); 
     map.put(name, value); 
    } 
    return map; 
} 

またセッターとゲッター多分悪、私はちょうどこれをドロップする必要がありますか?

答えて

3

代わりに代わりにcls.getDeclaredFieldsを使用しますか? (プライベートフィールドを取得する前にf.setAccessible(true))。

getterとsetterが必要な場合は、getDeclaredMethodsでメソッドを取得する必要があります。次に自分のリフレクションロジックを書く代わりにBeanUtilsを使用することをお勧めします:)(IMHOの都合の悪さはjava.beans.Introspectorです)。

+0

ありがとうzacheusz。それはうまくいくが、getterとsetterによって公開されたフィールドだけでなく、すべてのプライベートフィールドがリストされます。実際には私のクラスには_nameと_bar以上のものがあります。 – Phil

+0

getterとsetterが必要な場合は、 'getDeclaredMethods'メソッドを取得する必要があります。代わりに[BeanUtils](http://commons.apache.org/beanutils/)を使用することをお勧めします;) booleanのJava gettersは 'is'と' get'で始めることができます。 – zacheusz

+0

これは最も実現可能なようですが、実際にはdalvik VMですが、残念ながらIntrospectorは利用できません(そうでなければ、私はそのことに気づきました)。 – Phil

1

あなたはこのような何かを行うことができます。

List<Method> methods = Arrays.asList(getClass().getDeclaredMethods()); 
for (Method m : methods) 
{ 
    String name = m.getName(); 
    if (name.startsWith("get") || name.startsWith("is")) 
    { 
     // Do something with the getter method 
    } else if (name.startsWith("set")) 
    { 
     // Do something with the setter method 
    } 
} 
+2

メソッドがありません(ブーリアン 'isXxx'など)。多くの場合(たとえば、paramsで名前付きメソッドを取得し、複数のパラメータでメソッドを設定するなど)そのようなアプローチはお勧めしません。 –

+1

とbooleanのgetterは 'is'で始めることができます – zacheusz

+0

答えに感謝しますが、これは私に合っていません。たとえば、5つまたは6つのフィールドを持つクラスがあれば、if文をロードして終了します。 – Phil

3

Introspectorクラスを使用します。 BeanInfoを取得し、getPropertyDescriptors()メソッドを使用します。それは途中であなたを取得する必要があります。

+0

非常に良い点ですが、BehoUtilsよりも便利ではない – zacheusz

+2

合意して、私は他のライブラリにも頼るでしょう。そこにカップルがあります。 Springは、クラスパスにすでに存在しているほとんどのものです。 stackoverflowのために、私は言語ネイティブの機能へのポイントが好きです。 –

関連する問題