2

情報を保持するように宣言されたクラスがあります。これらのフィールドがあるとしましょう

class data {
   int a;
   int b;
   int c;
}

そして、私はこのようにこれらのフィールドにアクセスしたいと思います:

String [] fields = {"a", "b", "c"};
data da = new data();
for (int i = 0; i < 3; i++) 
   if (da.fields[i] < 10)
      dosomething();

これを行う方法はJavaにありますか?グーグルで、「リフレクション」と呼ばれるものについていくつかの結果を得ましたが、それを実際に聞いたことがなく、それが私が望んでいるものではないと思います。Javaでこれを行う方法はありますか?そうでない場合、この種のことをサポートする言語はありますか(好奇心から)?

4

4 に答える 4

5

反射はおそらくあなたが必要とするものです。しかし、もっと必要なのは、デザインをよく見ることです。可能な限り反射を避ける必要があります。

それでもこれを行うことに興味がある場合は、Java Reflection:Fieldsを参照してください。

Field field = aClass.getField("someField");

その名前でフィールドを取得するために行うことです。あなたが欲しいもののより詳細な例。

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);
于 2013-01-18T02:29:43.250 に答える
4

クラスに適切なAPIを追加できます。

class data {
   int a;
   int b;
   int c;

   int get(String field) {
       if (field.equals("a")) return a;
       if (field.equals("b")) return b;
       if (field.equals("c")) return c;
       throw new IllegalArgumentException();
   }
}

次に、次のことができます。

String [] fields = {"a", "b", "c"};
data da = new data();
for (int i = 0; i < 3; i++) 
   if (da.get(fields[i]) < 10)
      dosomething();
于 2013-01-18T02:41:59.817 に答える
0

リフレクションは進むべき道です。KarthikTが正解です。リフレクションを使用しない場合:

フィールドを配列(またはマップ)として宣言し、名前をルックアップとして宣言します。

class data {
    int[] fields = new int[3];
    public static final int A = 0;
    public static final int B = 1;
    public static final int C = 2;
 }

 public void foo() {
     data da = new data();
    int[] fields = {data.A, data.B, data.C};
    for (int n : fields) {
       if (da.fields[n] < 10) doSomething();
    }
 }

その醜い、そしてあなたがこのようなことをしたいのならあなたのデザインはおそらく間違っていますが、それはうまくいきます。

于 2013-01-18T02:37:09.453 に答える
0

あなたは本当にあなたの本当の問題が何であるかを言いません。そのため、リフレクションなどを使用することが必要かどうかはわかりません。ただし、誰かが文字列値を別の変数に関連付けることについて話すとき、彼らがしばしば使用する必要があるのはマップ(または他の言語の辞書)です。次のようなもの:

    TreeMap<String, Integer> tm = new TreeMap<String, Integer>();       
    tm.put("a", 1);
    tm.put("b", 2);
    tm.put("c", 3);

    for (String k: tm.keySet()) {
        System.out.println(k + ": " + tm.get(k));
    }
于 2013-01-18T04:08:10.623 に答える