Справка CodeModel, необходимая для правостороннего присваивания singleton.getinstance () - PullRequest
1 голос
/ 31 января 2011

Мне удалось сгенерировать 99% того, что мне нужно, с помощью CodeModel API, но я здесь тупик ...

Использование различных методов "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.

Любая помощь приветствуется ...

Ответы [ 2 ]

4 голосов
/ 31 января 2011

Может быть, я не до конца понимаю вопрос, но такой ли код в порядке?

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 голос
/ 03 марта 2011

Питер, я думаю, что вы ищете JVar # init (JExpression) .Это метод, который вы должны использовать для создания инициализации RHS объявления переменной или поля.

Итак, когда вы объявляете mapper и получаете JVar, вызываете init для этого JVar и передаете JExpressionкоторый представляет ваш вызов com.blah.util.MapperSingleton.getMapperInstance().

Чтобы создать необходимое JExpression (такое, которое представляет вызов MapperSingleton), используйте myclass.owner().ref(MapperSingleton.class).staticInvoke("getMapperInstance").

...