簡體   English   中英

右側singleton.getinstance()分配所需的CodeModel幫助

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM