1

名前、年齢、スコアなどのフィールドを含む Records[] 型の配列があります。

これらのフィールドの 1 つにアクセスする必要があるメソッドがありますが、どのフィールドかはわかりません。

たとえば、次のことを行いたいです。

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

この場合、fieldToUse を見つけたいフィールドに切り替えることができます。ただし、これは機能しません。どうすればよいですか?

前もって感謝します。

編集: myRecords は Records 型です。

4

4 に答える 4

4

これは、リフェクションを使用して実行できます。

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

完全な例:

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
于 2012-05-16T08:33:10.687 に答える
2

あなたがしなければならないことは、Javaでは不可能だと思います。

あなたの構造では、あなたの構造を反復しRecords[]て正しいものを選択する必要があります。

HashMap<String, Record>where the Stringisを使用してみてくださいfieldToUse

このようhashmap.get(fieldToUse)にして、右のようなものを使用できますRecord

于 2012-05-16T07:58:49.617 に答える
1

可能性は、スタイルメソッドRecordsを持つようにのインターフェースを変更することです:getProperty()

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

内部的にRecordsは、実装を使用しMapて値を格納できます。nameがでありStringagescoreIntegerあると仮定するMapMap<String, String>、属性名でキー設定されます。さらに、Records適切なタイプを返す他の場所で使用するために、各属性のメソッドを提供できます。

于 2012-05-16T08:00:32.003 に答える
0

タイプ Record の Map 表現を作成できます。各フィールド名をキーとして。

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

これを配列に格納します。

アクセスできるようになりました

Records[0].get("名前");

これは、Java に関して私が考えることができる最高のものです。

于 2012-05-16T07:58:52.317 に答える