8

Object thisビアリフレクションのパブリックフィールドを設定しています。フィールド名と値の両方がとして与えられStringます。私はいくつかのさまざまなフィールドタイプを使用します:、、、、、独自BooleanInteger、および。FloatDoubleenumString

を除いて、Stringそれらすべてで機能します。スローされる例外は、署名を持つメソッドがString.valueOf(String)存在しないことです...ここで、ダーティなinstanceof回避策を使用して、各フィールドが文字列であるかどうかを検出し、その場合は値をフィールドにコピーします。

private void setField(String field, String value) throws Exception {
   Field wField = this.getClass().getField(field);

   if(wField.get(this) instanceof String){ //TODO dirrrrty hack
    //stupid workaround as java.lang.String.valueOf(java.lang.String) fails...
    wField.set(this, value);
   }else{
    Method parseMethod = wField.getType().getMethod("valueOf", new Class[]{String.class});
    wField.set(this, parseMethod.invoke(wField, value));
   }
 }

その回避策を回避する方法はありますか?

あなたはjava.lang.Stringその方法を支持すべきだと思いますvalueOf(String)か?

ありがとう。

4

4 に答える 4

8

お気づきのように、はありませんString.valueOf(String)。ただし、私はあなたの実装をハックとは見なさず、JDKクラスのマイナーな不整合を認識しているだけです。

より堅牢な文字列からオブジェクトへの変換については、文字列からオブジェクトへの変換を直接サポートするPropertyEditorsの使用を検討してください。プリミティブ型とデフォルトで提供される文字列の実装です。)解析メソッドは一貫性があり、さまざまな型を処理するように拡張できます。CommonsConvertおよびSpring3Type Convertersの変換クラスは、プロパティのGUI編集ではなく、純粋に変換に焦点を合わせているため、さらに優れています。

于 2010-05-30T14:38:08.153 に答える
0

その回避策を回避する方法はありますか?

これは、の実装に大きく依存しparseMethodます。

java.lang.StringはメソッドvalueOf(String)をサポートする必要があると思いますか?

何のために?それは何の操作にもならず、単にそのパラメータを返すだけです。

于 2010-05-30T14:17:45.657 に答える
0

あなたはjava.lang.Stringその方法を支持すべきだと思いますvalueOf(String)か?

いいえ。リフレクション以外ではほとんど価値がないため、リフレクションを推奨するべきではありません(Effective Java 2nd Edition、Item 53:リフレクションよりもインターフェースを優先します)。

于 2010-05-30T14:35:07.940 に答える
0

文字列の場合:

メソッドparseMethod=wField.getType()。getMethod( "valueOf"、new Class [] {Object.class});

wField.set(this、parseMethod.invoke(wField、value));

于 2013-06-10T10:22:28.600 に答える