在父对象内调用属性对象的方法

时间:2012-10-15 16:00:28

标签: java reflection cobol

我正在尝试为Cobol系统建模的Java框架中工作。我有一个具有许多属性的StudentRecord类。

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

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

}

假设我有一个StudentRecord类型的instanse studentA,其中String中的firstName值为'Max'。我想使用Java反射将属性firstName更新为'John'。通常情况下,我这样做:

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

因为这个框架是为Cobol建模的,所以它有一些奇怪的行为和要求。其中之一是我需要使用CobolString的方法setValue()为firstName设置新值以确保系统正常工作。

例如:没有反思,它需要我这样做:

studentA.firstName.setValue("John");

通过反射,如果我以这种方式编码,studentA仍然有新的firstName,但它对其他对象/方法变得陌生,并且无法与其他人一起工作!

那么如何使用Java反射为firstName设置新值来做同样的事情。我的意思是我如何从父对象studentA获取子对象firstName,然后使用新值“John”调用方法“setValue”。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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);