ああ、ああ、誰かが XJC の内部に興味を持っています。私はおそらく他の誰よりも多くの JAXB プラグインを開発してきたので、何らかの助けになるかもしれません (たとえば、 JAXB2 Basicsを参照してください)。
じゃあ始めよう。XJC では、スキーマ コンパイラはおおよそ次のことを行います。
- スキーマを解析します
- スキーマのモデルを作成します (CClass、CPropertyInfo など)。
- アウトラインを作成します (ClassOutline、FieldOutline など)。
- コード モデル (JClass、JDefinedClass、JMethod など) をレンダリングします。
- 物理コード (ディスク上の Java ファイルなど) を書き込みます。
最後の2つから始めましょう。
Java ファイルについては説明不要だと思います。
コードモデルも比較的簡単です。これは、Java コードをプログラムで構築するために使用できる API です。代わりに文字列連結を使用することもできますが、エラーが発生しやすくなります。CodeModel を使用すると、少なくとも文法的に正しい Java コードを取得できることがほぼ保証されます。ですから、この部分も明確になることを願っています。(ちなみに、私は CodeModel が大好きです。最近、CodeModel のアイデアに基づいてJavaScript コード モデルを作成しました。)
次に、「モデル」と「アウトライン」を見てみましょう。モデルは、受信スキーマを解析した結果です。主に、複合型に対応する「クラス」と、要素、属性、および値に対応する「プロパティ」の観点から、着信スキーマの構造をモデル化します (例: 単純なコンテンツを持つ複合型がある場合)。
モデルは、XML とスキーマに近い論理モデリング構造として理解する必要があります。そのため、それらが持つ型とプロパティを説明するだけです。私がそれをどのように説明しているかは、ワイルドカード型 (xsd:any)、置換グループ、列挙型、組み込み型などから始めて、あらゆる種類の例外と警告があることは確かにはるかに複雑です。
非常に興味深いことに、Model
isの兄弟がRuntimeTypeInfoSetImpl
実行時に JAXB によって使用されます。したがって、これはモデルの一種でもありますが、XML スキーマから解析されるのではなく、クラス内の JAXB アノテーションから解析されます。コンセプトは同じです。スーパーコンストラクトであるインターフェースのモデル化とRuntimeTypeInfoSetImpl
実装の両方。およびTypeInfoSet
のようなインターフェースを確認してください-コンパイル時(およびXJCで)と実行時(JAXB RIの場合など)の両方の実装があります。ClassInfo
PropertyInfo
CClassInfo
CPropertyInfo
RuntimeClassInfoImpl
わかりました。XJC がスキーマを解析して分析すると、Model
. これModel
ではまだコードを生成できません。実際、コードを生成するにはさまざまな戦略があります。注釈付きのクラスだけを生成することも、JAXB 1 のようにインターフェース/実装クラスのペアを生成することもできます。コード生成全体は、実際にはモデルのタスクではありません。さらに、Java コードの物理的性質に関連していても、実際にはモデルには関連していない側面が多数あります。たとえば、クラスをパッケージにグループ化する必要があります。これは、モデル自体のプロパティではなく、Java のパッキング システムによって駆動されます。
そして、これがアウトラインの出番です。アウトラインは、スキーマ モデルとコード モデルの間のステップとして見ることができます。JDefinedClass
アウトラインは、コードの編成と sからの esの生成を担当するコード モデル要素のファクトリとして表示できますCClassInfo
。
そうです、それは確かに非常に複雑です。私は Sun/Oracle の従業員ではありません。私はそれを設計しませんでした (私はそれを行った人を知っていますが、彼をとても尊敬しています)。たとえば、特定の設計上の決定についていくつかの理由を推測できます。
- コンパイル時モデルと実行時モデルに同じインターフェイスを使用する
- コード生成のさまざまな戦略を許可する
- プラグインが作成されたモデルを操作できるようにする
この設計が非常に複雑であることには同意しますが、それには理由があります。その証拠の 1 つは、XML から JavaScript へのマッピング用のマッピング ジェネレーターを、基本的に同じモデルで構築することが実際に可能であったことです。スキーマ分析をそのままにして、コード生成を置き換える必要がありました。( Jsonixを参照してください。)
わかりました、うまくいけば、XJC の物事がどのようになっているのかについて、いくつかの光を当てることができれば幸いです。これらの API で頑張ってください。単純ではありません。既存のオープンソース コードを自由に確認してください。多くの例が利用可能です。
ps。本当にずっとこれを書きたかった。:)