如何访问数组中的字段,其中存储在变量中的字段的名称?

问题描述:

我有一个Record []类型的数组,其中包含诸如名称,年龄和分数等字段。如何访问数组中的字段,其中存储在变量中的字段的名称?

我有一个方法,将需要访问这些领域之一,但我不知道哪个。

我想,例如,请执行下列操作:

String fieldToUse = "name"; 
System.out.println(myRecords[0].fieldToUse); 

在这种情况下,我可以切换到fieldToUse我想找到哪个领域。这不起作用,但是 - 我该怎么做?

在此先感谢。

编辑:myRecords是记录类型。

+2

什么是'记录类型[0]' ? – NPE

+0

对不起,我只是纠正了上面的帖子。该数组称为myRecords []并且类型为Records。类型记录包括一个字符串和一对数字。 – GuiR

我认为你需要做的事对于Java来说是不可能的。

有了你的结构,你应该遍历你的Records[]并选择正确的。

您可以尝试使用HashMap<String, Record>,其中StringfieldToUse

这样你可以使用像hashmap.get(fieldToUse)的东西,以获得正确Record

+2

它可能使用反射。 – dacwe

您可以录制类型的地图表示。以每个字段名称作为关键字。

Record 
name: "YXZ" 
age: 12 
score: 657 

现在将其存储在数组中。

您现在可以访问

记录[0] .get(“name”);

这是我能想到的最好的Java方面。

+0

如果您在程序的其他部分使用字段访问,那么这不是一个很好的解决方案(那么您需要用这种类型的访问来替换这些事件...)。 – dacwe

+0

同意。如果必须保留记录对象,那么反射将是一个好主意,正如你在其他答案中提到的那样。 –

一种可能性是改变的Records接口有一个getProperty()风格方法:

System.out.println(Records[0].getProperty(fieldToUse)); 

内部,Records可以使用Map实现存储的值。假设nameString,agescoreIntegers Map将是Map<String, String>,由属性名称作为键。此外,Records可以为每个属性提供方法,以供返回适当类型的其他地方使用。

可以这样做用便餐:

Field field = Record.class.getField(fieldToUse); 
Object fieldValue = field.get(record); 

完全exeample:

static class Record { 
    public String name; 
    public int age; 

    public Record(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
} 

public static void main(String[] args) throws Exception { 
    Record[] records = new Record[2]; 
    records[0] = new Record("David", 29); 
    records[1] = new Record("Andreas", 28); 

    System.out.println("Davids name: " + getField("name", records[0])); 
    System.out.println("Andreas age: " + getField("age", records[1])); 
} 

private static Object getField(String field, Record record) throws Exception { 
    return record.getClass().getField(field).get(record); 
} 

打印:

Davids name: David 
Andreas age: 28 
+0

getField如何返回基于getField的东西?这不会把它扔进一个无限循环吗? – GuiR

+0

这是对['Class.getField(String)']的调用(http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getField%28java.lang.String% 29),而不是递归。 – dacwe

+0

@GuiR,两者都是不同的方法与不同的参数。 – sgowd