java - 右侧 singleton.getinstance() 赋值所需的 CodeModel 帮助

标签 java code-generation sun-codemodel

我已经能够使用 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 的导入。

感谢任何帮助...

最佳答案

也许我没有完全理解这个问题,但是,这样的代码可以吗?

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);
    }

}

关于java - 右侧 singleton.getinstance() 赋值所需的 CodeModel 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851937/

相关文章:

来自 XSLT 的 Java 代码生成器

java - Codemodel不生成静态导入

java - 使用 CodeModel Java API 覆盖注解

java - 是否有与 super.super() 等效的函数?

java - 字符串缓冲区行为

java - 覆盖 toString() 给出错误

c# - 使用 T4 模板生成代码时引用第三方 DLL

java - 在gradle中更改生成代码的输出目录

java - 仅关闭一个 Jframe 窗口