【问题标题】:How can I make JAXB-generated classes participate in a Visitor pattern?如何让 JAXB 生成的类参与访问者模式?
【发布时间】:2011-06-17 22:40:55
【问题描述】:

大家好,希望这里能轻松搞定。

我正在使用 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...)

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

谢谢!

【问题讨论】:

    标签: jaxb visitor-pattern generated-code customising


    【解决方案1】:

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

    我使用这项技术创建了一个插件来实现访问者模式,并将其作为谷歌代码项目提供。它可能不是您想要的,但如果您需要修改代码以满足您的需求,它可能是开始审查代码和测试的好地方。

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

    【讨论】:

      【解决方案2】:

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

      话虽如此,如果您自定义 JAXB 生成的类,您需要考虑一些事情。如每个类的顶部所述“重新编译源架构后,对此文件的任何修改都将丢失”。简而言之,如果您自定义类,您将需要手动进行代码更改以支持任何模式更新。如果您确实重新生成了类,您的自定义代码将被删除,您将不得不重新开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 2011-09-20
        相关资源
        最近更新 更多