如何使JAXB生成的类参与访问者模式?

时间:2011-02-11 12:35:36

标签: jaxb visitor generated-code customising

嘿伙计们,希望这里很容易。

我正在使用架构中的JAXB生成类,我希望能够使用访问者模式处理它们。

要做到这一点,我想我需要每个JAXB生成的类来实现我定义的接口,并为它们添加一个非常简单的方法,所以一个简单的例子就是:

默认课程:

public class MyClass {
   private String name;

   public void get/setName() {...}
}

所需课程:

public class MyClass implements MyVisitorNode {
  private String name;

  public void get/setName() {...}

  public void accept(MyVisitorVisitor visitor) {
    visitor.visit(this);
  }
}

这是可能的,如果可以,有哪些选择? (更改架构,运行时字节码操作,以某种方式操纵JAXBContext ...)

理想情况下,不依赖于特定于供应商的扩展。

谢谢!

2 个答案:

答案 0 :(得分:4)

JAXB的xjc编译器有一个插件接口,允许开发人员创建修改生成的代码的插件。我个人最喜欢的是fluent-api,但还有其他人可以添加toString,equals,hashCode等。

我使用此技术创建了一个插件来实现访问者模式,并将其作为Google代码项目提供。它可能不是您正在寻找的,但如果您需要根据自己的需要进行修改,它可能是开始查看代码和测试的好地方。

http://code.google.com/p/jaxb-visitor/

答案 1 :(得分:2)

JAX-B生成的类是标准的Java类,您可以以任何方式自定义,例如,扩展接口,添加其他方法等。)。类和属性的注释是编组和解组过程的驱动因素。

如上所述,如果您自定义JAXB生成的类,则需要考虑一些事项。如每个类顶部所述“重新编译源模式时将丢失对此文件的任何修改”。简而言之,如果您自定义类,则需要手动进行代码更改以支持任何架构更新。如果您重新生成了类,那么您的自定义代码将被删除,您必须从头开始。