我已经能够使用CodeModel API生成99%的所需内容,但我在这里难倒......
使用各种“directXX”方法不会将import语句添加到生成的代码中,除了生成的类中的一个位置之外,我可以在没有“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);
}
你可以在parens中看到Mapper赋值的右手。发出整个包+类是我能找到的唯一方法,只需在右侧声明“SomeSingleton.someMethod()”并生成代码进行编译。如果没有将MapperSingleton添加到对象模型,则不会生成导入...
问题:
1)有没有办法强制导入生成?
2)如何声明一个表达式,它给出了对象模型中Mapper赋值的右侧(以便生成MapperSingleton的导入。
任何帮助表示赞赏...
答案 0 :(得分: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
EDIT! 第二次尝试
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);
}
}
答案 1 :(得分:1)
因此,当您声明mapper
并获取JVar时,请在此JVar上调用init
并传入代表您对com.blah.util.MapperSingleton.getMapperInstance()
的调用的JExpression。
为了创建你需要的JExpression(一个代表对MapperSingleton的调用),使用myclass.owner().ref(MapperSingleton.class).staticInvoke("getMapperInstance")
。