1

私は、Cobol システムをモデル化しようとしている Java フレームワークで作業しています。多くの属性を持つクラス StudentRecord があります。

class StudentRecord extend BaseRecord {
...
 public CobolString firstName;
 public CobolString lastName;
...
}

class CobolString {
...
 private String content;
 public setValue(String str){
 content = str;
}

}

String の firstName 値が「Max」である StudentRecord タイプのインスタンス studentA があるとします。Java リフレクションを使用して属性 firstName を「John」に更新したいと考えています。通常、私は以下のようにします。

Class  aClass = studentA.class;
Field field = aClass.getField("firstName");
field.set(studentA, new CobolString("John"));

このフレームワークは Cobol をモデル化するためのものであるため、いくつかの奇妙な動作と要件があります。その 1 つは、CobolString のメソッド setValue() を使用して、システムが確実に機能するように firstName に新しい値を設定する必要があることです。

例:リフレクションなしでは、次のことを行う必要があります。

studentA.firstName.setValue("John");

リフレクションを使用して、そのようにコーディングすると、studentA にはまだ新しい firstName がありますが、他のオブジェクト/メソッドにとって見知らぬ人になり、他のオブジェクトと連携できなくなります!!!

では、Java リフレクションを使用して同じことを行い、firstName に新しい値を設定するにはどうすればよいでしょうか。親オブジェクトのstudentAからサブオブジェクトのfirstNameを取得し、新しい値「John」でメソッド「setValue」を呼び出す方法を意味します。

手伝ってくれてありがとう。

4

1 に答える 1

4

リフレクションを使用してインスタンスのフィールドにアクセスできます。

StudentRecord obj;
Field field = obj.getClass().getField("firstName"); // or StudentRecord.class.getField()
CobolString cs = (CobolString)field.get(obj);
cs.setValue("John");

フィールドが の場合、privateを呼び出す前にこれを実行しField.get()ます。

field.setAccessible(true);
于 2012-10-15T16:15:36.573 に答える