gpt4 book ai didi

java - JCodeModel - 如何链接调用方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:22 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用循环来构建可在 .assign() 调用中使用的 JExpression。我知道您可以使用 JCodeModel 执行类似 JExpr.invoke("methodA").invoke("methodB") 的操作,但我希望能够添加每个 .invoke() 基于方法名称列表的方法。有谁知道如何做到这一点?

我的生成器代码示例 [假设我已修改 ArrayList.add() 方法以返回 ArrayList]:

JDefinedClass newClass = jCodeModel._class("com.me.GeneratedClass");
JClass refObject = jCodeModel.ref(Object.class);
JClass refArrayList = jCodeModel.ref(ArrayList.class);

JFieldVar objectList = newClass.field(refArrayList, "objects");

JBlock methodBody = newClass.method(JMod.PUBLIC, refArrayList, "getNewObjectList");

String[] methodsToInvoke = {"add", "add", "add"};

JExpression rhsAssignmentExpression = JExpr._new(refArrayList).narrow(refObject);
for(String methodName : methodsToInvoke) {
rhsAssignmentExpression.invoke(methodName).arg(JExpr._new(refObject));
}

methodBody.assign(objectList, rhsAssignmentExpression);
methodBody._return(objectList);

我要生成的示例:

class GeneratedClass {

ArrayList<Object> objects;

public ArrayList<Object> getNewObjectList()
{
objects = new ArrayList<Object>().add(new Object()).add(new Object()).add(new Object());
return objects;
}
}

我的问题是这个方法没有链接调用方法,而是替换了它们,因此生成的代码如下所示:

class GeneratedClass {

ArrayList<Object> objects;

public ArrayList<Object> getNewObjectList()
{
objects = new ArrayList<Object>().add(new Object());
return objects;
}
}

最佳答案

这也可以通过让 JCodeModel 打印原始字符串而不是声明 JCode 对象来完成。对于这个特定问题,不需要生成 java 导入——因此可以使用 directStatement() 完成。

StringBuilder expression = new StringBuilder();
expression.append (“objects = new ArrayList<Object>()”);

if ((methodsToInvoke != null) && (methodsToInvoke.length > 0))
{
for(String methodName : methodsToInvoke)
{
expression.append(“.add(new Object())”);
}
}

expression.append(“;”);

methodBoby.directStatement(expression.toString());

关于java - JCodeModel - 如何链接调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com