1

CodeModel API で必要なものの 99% を生成できましたが、ここで困惑しています...

さまざまな「directXX」メソッドを使用しても、生成されたコードに import ステートメントは追加されません。また、生成されたクラスの 1 か所を除いて、「directXXX」タイプのメソッドがなくても作業できます。

次のような生成されたメソッドが必要だとします。

/**
* Copies data from this Value-Obj instance, to the returned PERSON instance.
* 
* @return PERSON
* 
*/
public PERSON mapVOToPERSON() throws MappingException
{
   Mapper mapper = (com.blah.util.MapperSingleton.getMapperInstance());
   return mapper.map(this, PERSON.class);
}

Mapper 割り当ての右側が括弧内に表示されます。パッケージ+クラス全体を発行することが、右側で「SomeSingleton.someMethod()」を宣言し、生成されたコードをコンパイルする唯一の方法でした。MapperSingleton がオブジェクト モデルに追加されていないと、インポートは生成されません...

質問:

1) インポートを強制的に生成する方法はありますか?

2) オブジェクト モデル内で Mapper 割り当ての右側を与える式を宣言する方法 (MapperSingleton のインポートが生成されるようにするため)。

助けていただければ幸いです...

4

2 に答える 2

4

質問の意味がよくわからないかもしれませんが、このようなコードでよろしいでしょうか?

JCodeModel model = new JCodeModel();
JClass mapper = model.directClass("com.another.Mapper");
JClass factory = model.directClass("com.another.MapperSingleton");
JDefinedClass dc = model._class("com.example.Something");
JMethod method = dc.method(JMod.PUBLIC | JMod.STATIC, mapper, "testMethod");
method.body()._return(factory.staticInvoke("getMapperInstance"));
model.build(destinationDirectory);

生成します

package com.example;

import com.another.Mapper;
import com.another.MapperSingleton;

public class Something {


    public static Mapper testMethod() {
        return MapperSingleton.getMapperInstance();
    }

}

これは CodeModel 2.4 の場合です

編集!2 回目の試行

    JCodeModel model = new JCodeModel();
    JClass mapper = model.directClass("com.blah.util.Mapper");
    JClass factory = model.directClass("com.blah.util.MapperSingleton");
    JDefinedClass dc = model._class("com.example.Something");
    JDefinedClass person = model._class("com.example.PERSON");
    JMethod method = dc.method(JMod.PUBLIC, person, "mapVOToPERSON");
    JBlock block = method.body();
    JVar lhs = block.decl(mapper, "mapper", factory.staticInvoke("getMapperInstance"));
    JInvocation map = lhs.invoke("map");
    map.arg(JExpr._this()); 
    map.arg(person.dotclass());
    method.body()._return(map);
    model.build(destinationDirectory);

生成する

package com.example;

import com.blah.util.Mapper;
import com.blah.util.MapperSingleton;

public class Something {


    public PERSON mapVOToPERSON() {
        Mapper mapper = MapperSingleton.getMapperInstance();
        return mapper.map(this, PERSON.class);
    }

}
于 2011-01-31T15:43:15.220 に答える
1

ピーター、あなたが探しているのはJVar#init(JExpression)だと思います。これは、変数またはフィールド宣言の RHS 初期化を作成するために使用する必要があるメソッドです。

したがって、JVar を宣言mapperして取得するときはinit、この JVar を呼び出して、呼び出しを表す JExpression を に渡しますcom.blah.util.MapperSingleton.getMapperInstance()

必要な JExpression (MapperSingleton への呼び出しを表すもの) を作成するには、myclass.owner().ref(MapperSingleton.class).staticInvoke("getMapperInstance").

于 2011-03-02T23:21:22.630 に答える