2010-12-30 4 views
9

私はリソースバンドルからのループ内のクラスの文字列、フィールド名のリストを持っています。私はオブジェクトを作成し、ループを使用してそのオブジェクトの値を設定したい。たとえば、パラメータPARAM1を持つオブジェクトリフレクションを使用してダイナミックセッターとゲッターを定義する方法は?

Foo f = new Foo(); 

のために、私は、文字列「PARAM1」を持っていると私は何とか「設定」+「のparam1」のようなそれで「設定」をconcateして、Fのインスタンスとしてでそれを適用します:

f.setparam1("value"); 

ゲッターについても同様です。私は反射が助けになると知っていますが、私はそれをすることができませんでした。 助けてください。ありがとう!

+0

これまでに存在するすべてのものに対してセッターとゲッタを作成している場合は、物事を公開することを検討する必要があります。 – EnabrenTane

+0

属性がpublicであっても、文字列がフィールドとして動作するようにリフレクションを使用するにはどうすればよいですか? – wasimbhalli

+1

なぜそれを自分で実装するのですか? Lombok(http://projectlombok.org/features)を使用することができます。クラスに '@ Getter'アノテーションを追加するだけで、各フィールドのゲッターメソッドが生成されます(ソースコード生成ツールではありません)。 – rodion

答えて

6

このようなことができます。

Class aClass = f.getClass(); 
Class[] paramTypes = new Class[1]; 
paramTypes[0] = String.class; // get the actual param type 

String methodName = "set" + fieldName; // fieldName String 
Method m = null; 
try { 
    m = aClass.getMethod("confirmMsg", paramTypes); 
} catch (NoSuchMethodException nsme) { 
    nsme.printStackTrace(); 
} 

try { 
    String result = (String) m.invoke(f, fieldValue); // field value 
    System.out.println(result); 
} catch (IllegalAccessException iae) { 
    iae.printStackTrace(); 
} catch (InvocationTargetException ite) { 
    ite.printStackTrace(); 
} 
+1

confirmMsgをmethodNameに置き換えてください...それは、ありがとうalot :) – wasimbhalli

+0

こんにちは、助けてください。私は詳細が必要です。 – nurealam11

7

Apache Commons BeanUtilsはそれをしない:あなたはフィールド上でループするためにそれを使用できるように、このコードは、より汎用的にすることができます。

+1

リンクされたリソースが質問に答えるために何をするかに関する情報を提供すると便利です。 – freakTheMighty

+0

このリンクは、サンプル[example](http://www.codesuggestions.com/java/apache-commons-bean-utils-tutorial/)を参照してください。 – Uppicharla

関連する問題