java - 如何使用 CodeModel 调用第二级抽象父类(super class)的方法?

标签 java code-generation sun-codemodel

我使用的是 CodeModel 2.6。

当 getType( ) 方法继承自 JDefinedClass 之上两级的抽象父类(super class)时,我将如何生成此指令?

    assertEquals(GeneraldocumenMetadata.TYPE, generaldocumenMetadata.getType());

背景:

  1. assertEquals(...) 方法来自“import static org.junit.Assert.assertEquals;”
  2. 类层次结构是
    • GeneraldocumenMetadata 扩展了 ItemMetadata
    • ItemMetadata 扩展 AbstractItemMetadata
    • AbstractItemMetadata 拥有 getType() 方法和私有(private)类型字段

最终结果/期望的方法如下:

@Test
public void testParameterizedConstructorSuccess()
{
    String modifiedType = GeneraldocumenMetadata.TYPE + "andMore";
    generaldocumenMetadata = new GeneraldocumenMetadata(modifiedType);

    assertEquals(modifiedType, generaldocumenMetadata.getType());
}

CodeModel 方法目前看起来像这样,但是“defineClass.getMethod("getType", new JType[] {});”返回 null

private void testDefaultConstructorMethod(JFieldVar uutField, JVar staticTYPEVar, final JDefinedClass unitTestClass, JDefinedClass definedClass, JCodeModel codeModel)
{
    int modifiers = JMod.PUBLIC;

    JMethod unitTestMethod = unitTestClass.method(modifiers, Void.TYPE, "testDefaultConstructor");
    unitTestMethod.annotate(org.junit.Test.class);

    JBlock unitTestBody = unitTestMethod.body();

    unitTestBody.assign(uutField, JExpr._new(unitTestClass));
    JClass abstractItemMetadataClass = definedClass._extends();

    JMethod getTypeMethod = definedClass.getMethod("getType", new JType[] {});
    JExpr.invoke(getTypeMethod);

    JInvocation assertEqualsInvoke = codeModel.directClass("org.junit.Assert").staticInvoke("assertEquals").arg(staticTYPEVar).arg(JExpr.invoke(getTypeMethod));
    unitTestBody.add(assertEqualsInvoke);
}

最佳答案

您需要调用该方法,而不是获取它,因为 codeModel 不会解析您定义的类:

JExpr.invoke(uutField, "getType");

这意味着您的代码模型代码将如下所示:

private void testDefaultConstructorMethod(JFieldVar uutField, JVar staticTYPEVar, final JDefinedClass unitTestClass, JDefinedClass definedClass, JCodeModel codeModel)
{
    int modifiers = JMod.PUBLIC;

    JMethod unitTestMethod = unitTestClass.method(modifiers, Void.TYPE, "testDefaultConstructor");
    unitTestMethod.annotate(org.junit.Test.class);

    JBlock unitTestBody = unitTestMethod.body();

    unitTestBody.assign(uutField, JExpr._new(unitTestClass));
    JClass abstractItemMetadataClass = definedClass._extends();

    JInvocation assertEqualsInvoke = codeModel.ref(org.junit.Assert.class).staticInvoke("assertEquals").arg(staticTYPEVar).arg(JExpr.invoke(uutField, "getType"));
    unitTestBody.add(assertEqualsInvoke);
}

关于java - 如何使用 CodeModel 调用第二级抽象父类(super class)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454860/

相关文章:

javascript - 克隆数据时指定目标?

java - 在哪里放置 swagger 生成的服务器代码的代码

c# - 免费的SQL Server存储过程生成器?

java - 添加现有代码模型的方法

java - 如何在 OKhttp 中使用多部分文件上传请求发送正文参数

java - 捕获 Spring 中 PropertyEditors 抛出的 IllegalArgumentException

java - 如何自定义 JSplitPane 分隔线并保持一键式箭头功能?

java - JCodemodel 中的异常消息

java - 在 XJC 插件的 CodeModel 中找不到异常类

java - 避免服务类之间的紧耦合