代码生成和反射

时间:2011-07-19 09:05:37

标签: java code-generation

我在代码中创建了一个对象的克隆。

Class<?> oc = o.getClass();
Object preStateInstance = oc.newInstance();

现在我必须输出一个Java文件,我希望创建的文件具有该克隆实例的赋值。类似的东西:

Object varX = preStateInstance.value;

这可能吗?怎么样?

我要做的是创建测试用例。我想将测试对象的实例保存为预状态值,以便能够比较对象的前后状态。我已经在我的代码中完成了,现在我需要将它输出到JUnit文件。在处理JUnit文件写入的类中,我只能访问preStateInstance

编辑:我想我还是没有说清楚。我的JUnit编写器要求我传递一个字符串,以便将它输出到一个完整的JUnit文件。在克隆实例后,我必须告诉我的作者如何在它的文件中初始化它。

4 个答案:

答案 0 :(得分:1)

要创建克隆,您必须实现Cloneable Interface和克隆方法,该方法创建新对象并复制必要的属性。

但是对于你的单元测试,我建议使用某种序列化,看一下XStream(http://x-stream.github.io/)它将一个对象转换成XML,反之亦然,这样你甚至可以编辑XML - 非常适合测试用例恕我直言。

答案 1 :(得分:0)

(公共)类成员也可以使用反射访问:

Field field = oc.getField("value");
Object varX = field.get(preStateInstance);

但请注意以下事项:

  1. Class.newInstance()不会创建o的克隆。它会创建o
  2. 的新实例
  3. Class.newInstance()调用默认构造函数。确保它可用
  4. 您无法访问受保护或较低可见性的字段

答案 2 :(得分:0)

如果需要克隆Java对象,可以使用内置的clone()方法(您的类必须实现Cloneable)。或者使用各种Bean属性库中的一个(例如commons / beanutils)将状态从一个Object转移到另一个Object。

答案 3 :(得分:0)

@Daniel,很棒的答案。

如果您尝试保存对象内容以便在运行测试时能够将其读回来,那么您可能会考虑序列化

http://www.exampledepot.com/egs/java.io/SerializeObj.html

http://www.exampledepot.com/egs/java.io/DeserializeObj.html

Daniel的方法甚至更好,如果你想手动更改数据,序列化,以二进制存储。