[英]CodeModel help needed for right-hand singleton.getinstance() assignment
我已經能夠使用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);
}
您可以在括號中看到Mapper分配的右手。 發出整個package + class是我只能在右側聲明“ SomeSingleton.someMethod()”並編譯生成的代碼的唯一方法。 如果沒有將MapperSingleton添加到對象模型,則不會生成導入。
問題:
1)有沒有一種方法可以強制導入?
2)如何聲明一個表達式,該表達式使我在對象模型內獲得Mapper賦值的右側(以便生成MapperSingleton的導入。
任何幫助表示贊賞...
也許我不完全理解問題,但是,這樣的代碼可以嗎?
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);
}
}
彼得,我想您正在尋找的是JVar#init(JExpression) 。 這是您用來創建變量或字段聲明的RHS初始化的方法。
因此,當您聲明mapper
並獲得一個JVar時,請在此JVar上調用init
並傳入表示您對com.blah.util.MapperSingleton.getMapperInstance()
調用的com.blah.util.MapperSingleton.getMapperInstance()
。
為了創建所需的JExpression(代表對MapperSingleton的調用),請使用myclass.owner().ref(MapperSingleton.class).staticInvoke("getMapperInstance")
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.