首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未导入JCodeModel参考资料

未导入JCodeModel参考资料
EN

Stack Overflow用户
提问于 2019-11-27 10:08:11
回答 1查看 158关注 0票数 0

我正在尝试创建一个类(MoMoTest.class),它扩展了一个通用抽象类(MappingObject.class)。一切看起来都很好,除了JCodeModel没有导入缩窄类(MoTest.class),尽管我用codeModel.ref创建了一个JClass:

MappingObject.class:

代码语言:javascript
复制
package test;

public abstract class MappingObject<T> {

    protected T dataObject;

    public MappingObject( T dataObject ) {
        this.dataObject = dataObject;
    }

    public abstract T getDataObject();

    public abstract String getStandardFormat();
}

MoTest.class:

代码语言:javascript
复制
package test;

public class MoTest {
}

MappingObjectCreator.class:

代码语言:javascript
复制
package test;

import com.sun.codemodel.*;
import java.io.File;
import java.io.IOException;

public class MappingObjectCreator {

    public JDefinedClass getMappingObject(JCodeModel codeModel, JPackage jPackage, Class<?> clazz)     throws JClassAlreadyExistsException {
        JClass ref = codeModel.ref(clazz); // Not imported in MoMoTest.class
        JDefinedClass definedClass = jPackage._class("Mo" + ref.name());
        JClass superClass = codeModel.ref(MappingObject.class).narrow(ref);
        definedClass._extends(superClass);
        JFieldRef dataObject = JExpr.ref("dataObject");

        JMethod constructor = definedClass.constructor(JMod.PUBLIC);
        JVar param = constructor.param(ref, ref.name());
        constructor.body().invoke("super").arg(param);

        JMethod getDataObject = definedClass.method(JMod.PUBLIC, ref, "getDataObject");
        getDataObject.annotate(codeModel.ref(Override.class));
        getDataObject.body()._return(dataObject);

        JMethod getStandardFormat = definedClass.method(JMod.PUBLIC, String.class, "getStandardFormat");
        getStandardFormat.annotate(codeModel.ref(Override.class));
        getStandardFormat.body()._return(dataObject.invoke("toString"));

        return definedClass;
    }

    public void getMappingObject(Class clazz, String path) throws JClassAlreadyExistsException, IOException {
        JCodeModel codeModel = new JCodeModel();
        JPackage jPackage = codeModel._package(clazz.getPackage().getName());

        getMappingObject(codeModel, jPackage, clazz);
        codeModel.build(new File(path));
    }

    public static void main(String[] args) throws IOException, JClassAlreadyExistsException {
        new MappingObjectCreator().getMappingObject(MoTest.class, "src/main/java");
    }
}

结果(MoMoTest.class):

代码语言:javascript
复制
package test;


public class MoMoTest
    extends MappingObject<test.MoTest>
{


    public MoMoTest(test.MoTest MoTest) {
        super(MoTest);
    }

    @Override
    public test.MoTest getDataObject() {
        return dataObject;
    }

    @Override
    public String getStandardFormat() {
        return dataObject.toString();
    }

}

那么,为什么Motest.class不在MomoTest.class中导入呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 14:27:38

在将生成类(MoMoTest.class)的构造函数的参数名称修改为大小写后,它以某种方式工作:

MappingObjectCreator.class:

代码语言:javascript
复制
        JMethod constructor = definedClass.constructor(JMod.PUBLIC);
        char[] refName = ref.name().toCharArray();
        refName[0] = Character.toLowerCase(refName[0]);
        JVar param = constructor.param(ref, new String(refName));
        constructor.body().invoke("super").arg(param);

结果:

代码语言:javascript
复制
package test;


public class MoMoTest
    extends MappingObject<MoTest>
{


    public MoMoTest(MoTest moTest) {
        super(moTest);
    }

    @Override
    public MoTest getDataObject() {
        return dataObject;
    }

    @Override
    public String getStandardFormat() {
        return dataObject.toString();
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59067679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档