我有一个声明要保存信息的类。假设它有这些字段
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中这样做?如果没有,是否有任何语言支持这种事情(只是出于好奇)?
答案 0 :(得分: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);
答案 1 :(得分: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();
答案 2 :(得分: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();
}
}
它的丑陋,如果你想做这样的事情,你的设计可能是错的,但它有效。
答案 3 :(得分: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));
}