web-dev-qa-db-ja.com

Java Reflection Beans Property API

JavaのようなBeanプロパティにアクセスする標準的な方法はありますか

class A {
   private String name;

   public void setName(String name){
       this.name = name;
   }

   public String getName(){
       return this.name;
   }

}

したがって、Reflection APIを使用してこのJava Beanプロパティ名にアクセスできます。プロパティの値を変更すると、そのプロパティの値を設定および取得するときにgetNameおよびsetNameのメソッドが自動的に呼び出されます。

24
Troydm

必要なのはBeanInfo/Introspectorメカニズムです(Bozhoの答えを参照)。ただし、これを直接使用するのは地獄なので、プロパティベースのアクセスを提供するライブラリのいずれかを使用できます。最もよく知られているのはおそらく Apache Commons/BeanUtils (もう1つはSpringの BeanWrapper 抽象化です)

サンプルコード:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 
43

あなたの質問は非常に不明瞭ですが、私がそれを得るならば:

はい。 _Java.beans_パッケージには、いわゆる Introspector があります。そこで、Beanのプロパティを読み取ることができます。

_BeanInfo info = Introspector.getBeanInfo(Bean.class);
PropertyDescriptor[] pds = info.getPropertyDescriptors();
_

名前で目的のPropertyDescriptorを見つけることができ、getReadMethod().invoke(..)を呼び出すことができます

41
Bozho

メソッドに渡されたクラスに関する情報がなかったため、BeanUtilsとPropertyDescriptorsを試しました。渡されたプロパティのデータ型さえ知らなかったため、値の設定が困難になりました。 BeanUtilsがプロパティの変換を自動的に行って設定する必要があることは知っていますが、データを保存していませんでした。だから最後に、フィールドを取得することに頼らざるを得ませんでした。ここに私がやったことがあります:

Field[] fields = className.getDeclaredFields();
for (int i=0; i<fields.length ;i++)
{
  String element = fields[i].getName();
  String propertyType = fields[i].getType().getName();
  fields[i].setAccessible(true);
  if(propertyType.equalsIgnoreCase("Java.lang.Integer"))
    {
      fields[i].set(mypojoObj, Integer.parseInt(parameterValue));
    }
    else
    {
      fields[i].set(mypojoObj, parameterValue);
    }
 }

同様のスイッチケースを実行して、すべてのプロパティタイプを正しいタイプに変換しました。ページからフェッチするとき、request.getParameter(paramname)は常にStringを返していたため、この変換は機能しました。直接データ変換のためのより良いオプションは本当に役立ちます。

1
Manish