1

我已经能够使用 CodeModel API 生成我需要的 99% 的东西,但我在这里被难住了......

使用各种“directXX”方法不会将导入语句添加到生成的代码中,并且我可以在没有“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

编辑!第二次尝试

    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 初始化的方法。

因此,当您声明mapper并获取 JVar 时,调用init此 JVar 并传入代表您对com.blah.util.MapperSingleton.getMapperInstance().

为了创建您需要的 JExpression(代表对 MapperSingleton 的调用),请使用myclass.owner().ref(MapperSingleton.class).staticInvoke("getMapperInstance").

于 2011-03-02T23:21:22.630 回答