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 反射:字段

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

反思是要走的路。Karthik T 有正确的答案。不使用反射:

将字段声明为数组(或 Map),并将名称声明为查找:

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

你并没有真正说出你真正的问题是什么;所以很难说是否需要使用反射或其他东西。然而,当有人谈到将一​​个字符串值与另一个变量相关联时,他们经常需要使用的是 Map(或其他语言的字典);类似的东西:

    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 回答