2

皆さん、うまくいけば、ここでとても簡単なものになります。

スキーマから 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 を何らかの方法で操作します...)

ベンダー固有の拡張機能に依存しないことが理想的です。

ありがとう!

4

2 に答える 2

4

JAXB 用の xjc コンパイラには、開発者が生成されたコードを変更するプラグインを作成できるプラグイン インターフェイスがあります。私の個人的なお気に入りは fluent-api ですが、他にも toString、equals、hashCode などを追加できます。

このテクノロジを使用して訪問者パターンを実装するプラグインを作成し、Google コード プロジェクトとして利用できるようにしました。これはまさにあなたが探しているものではないかもしれませんが、ニーズに合わせてコードを変更する必要がある場合は、コードとテストのレビューを開始するのに適した場所かもしれません。

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

于 2011-06-06T11:31:24.450 に答える
2

JAX-B で生成されたクラスは、インターフェースの拡張、メソッドの追加など、任意の方法でカスタマイズできる標準の Java クラスです。クラスと属性の注釈は、マーシャリングおよびアンマーシャリング プロセスの推進要因です。

そうは言っても、JAXB で生成されたクラスをカスタマイズする場合は、考慮しなければならないことがあります。各クラスの上部に記載されているように、「このファイルへの変更は、ソース スキーマの再コンパイル時に失われます」。つまり、クラスをカスタマイズする場合、スキーマの更新をサポートするためにコードを手動で変更する必要があります。クラスを再生成すると、カスタム コードが削除され、最初からやり直す必要があります。

于 2011-02-11T18:01:42.767 に答える