2

Class名前で属性にアクセスできますか?

例えば:

class Test {
    Integer GoodVar;
    Integer BadVar;
    ...

    void Func(String name, Integer value) {
        // Set A Value based on its name
    }

    void Init() {
        Func("GoodVar", 2);
        Func("BadVar", 1);
    }
}

誰かがコードFunc機能できますか?

4

4 に答える 4

3

switch ステートメントを使用できます。JDK 7 では文字列が許可されています ( http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.htmlを参照)。何かのようなもの:

switch (name) {
     case "GoodVar":
         GoodVar = value;
         break;
     case "BadVar":
         BadVar = value;
         break;
     default:
         throw new IllegalArgumentException("Invalid name: " + name);
 }

JDK 7 より前では、代わりに if ステートメントを使用できます。リフレクションを使用する別のアプローチ (参照: http://docs.oracle.com/javase/tutorial/reflect/index.html ) ですが、次のように遅いです:

Field f = getClass().getField(name);
if (f!=null){
 f.setAccessible(true);
 f.setInt(this, value);
}else
  throw new IllegalArgumentException("Invalid name: " + name);  
于 2012-10-15T11:23:20.117 に答える
1

あなたが探しているものは反射と呼ばれます。次のことができます。

void Func(String name, Integer value) {
    Field f = getClass().getField(name);
    f.setAccessible(true); // needed because f is not public
    f.setInt(this, value)
}

しかし、コメントを追加してもよろしいですか?

  1. 慣例により、フィールド、変数、およびメソッドは小文字で始める必要があります。
  2. フィールドは非公開にする必要があります。それらを保護またはパッケージ保護できる特殊なケースがいくつかあります。これはあなたの場合ではありません。
于 2012-10-15T11:28:02.187 に答える
0

これも試してください:

package SO;

import java.lang.reflect.Field;

class Test {
    Integer GoodVar;
    Integer BadVar;

    void Func(String name, Integer value) throws IllegalArgumentException, IllegalAccessException {
    Field[] fields = this.getClass().getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
        if (name.equals(field.getName())) {
        field.set(this, value);
        }
    }
    }
   // or a optimul way:
 void Func1(String name, Integer value) throws IllegalArgumentException, IllegalAccessException, SecurityException,
        NoSuchFieldException {
    Field field = this.getClass().getDeclaredField(name);
    field.setAccessible(true);
    field.set(this, value);
    }
    void Init() throws IllegalArgumentException, IllegalAccessException {
    Func("GoodVar", 2);
    Func("BadVar", 1);
    }

    @Override
    public String toString() {
    return "[GoodVar->" + GoodVar + ",BadVar-> " + BadVar + "]";
    }
}

サンプル Main メソッドを使用:

package SO;

public class TestTest {
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
    Test test = new Test();
    System.out.println(test);
    test.Func("GoodVar", 1);
    test.Func("BadVar", 2);
    System.out.println(test);
    }
}

それは印刷します:

[GoodVar->null,BadVar-> null]
[GoodVar->1,BadVar-> 2]
于 2012-10-15T11:37:30.453 に答える
0

これを試して:

void Func(String name, Integer value) {
    // Set A Value based on its name
    Field f = getClass().getDeclaredField(name);
    f.setAccessible(true);
    f.set(this, value);
}
于 2012-10-15T11:27:22.757 に答える