3

最新のJAXB(Metro)を使用し、XJCでJavaを生成しています...。

(他のユーザーが求めているように)無制限のシーケンスを表すフィールドのタイプとしてjava.util.Setを生成したい。そのタイプのフィールドはXJCによってUntypedListFieldとしてキャプチャされ、デフォルトの動作はjava.util.List(ゲッターのみ)を生成するように見えます。collection-setter-injectorプラグインと同様のことを行い、フィールドのタイプを次のように調整する場合

 public boolean run(Outline model, Options opt, ErrorHandler errorHandler) {
    for (ClassOutline co : model.getClasses()) {
       FieldOutline[] fo = co.getDeclaredFields();

       for ...
          if ((fo[i] instanceof UntypedListField)) {
            --> DO SOMETHING WITH THIS FIELD
          }
    }
 }

人々はどのように型を調整しますか、または新しいフィールドを構築して、クラスのアウトラインで宣言されたフィールドのセットでそれを置き換えるのは簡単ですか?フィールドのタイプをいじると、プロパティのgetメソッドの生成にどのように影響しますか?

4

1 に答える 1

1

独自の XJC プラグインを使用しているようです。だからここにあなたがする必要があるものがあります。--> DO SOMETHING WITH THIS FIELD行を次のように置き換えます。

最初に、fo[i](私は f と呼んでいます) のパラメーター化の型を調べます。次に、セット JType を作成します。そして最後に のタイプを に設定fsetTypeます:

JType inner = ((JClass)f.type()).getTypeParameters().get(0);
JType setType = co.parent().getCodeModel().ref(Set.class).narrow(inner);
f.type(setType);

このメソッドnarrow()は、パラメータ化タイプを設定するために使用されます。

これまでのところ問題はないように見えますが、問題は、XJC がクラスの生成を完了した後にプラグインが実行されることです。つまり、ゲッターはすでにそこにあります。そのため、交換する必要があります。

そして、ここにreplaceGetter()方法があります

private void replaceGetter(ClassOutline co, JFieldVar f, JType inner) {
    //Create the method name
    String get = "get";
    String name  = f.name().substring(0, 1).toUpperCase() 
            + f.name().substring(1);
    String methodName = get+name;

    //Create HashSet JType
    JType hashSetType = co.parent().getCodeModel().ref(HashSet.class).narrow(inner);

    //Find and remove Old Getter!
    JMethod oldGetter = co.implClass.getMethod(methodName, new JType[0]);
    co.implClass.methods().remove(oldGetter);

    //Create New Getter
    JMethod getter = co.implClass.method(JMod.PUBLIC, f.type(), methodName);

    //Create Getter Body -> {if (f = null) f = new HashSet(); return f;}
    getter.body()._if(JExpr.ref(f.name()).eq(JExpr._null()))._then()
    .assign(f, JExpr._new(hashSetType));

    getter.body()._return(JExpr.ref(f.name()));
}

これがお役に立てば幸いです。

于 2013-09-08T02:02:25.507 に答える