我正在尝试弄清楚如何使用循环来构建JExpression
,我可以在.assign()
调用中使用它。我知道您可以使用JCodeMode执行JExpr.invoke("methodA").invoke("methodB")
之类的操作,但我希望能够根据方法名称列表添加每个.invoke()
方法。有谁知道怎么做?
我的Generator代码示例[假设我已经修改了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;
}
}
答案 0 :(得分:1)
这也可以通过让JCodeModel打印原始字符串而不是声明JCode对象来完成。对于这个特殊问题,不需要生成java-imports - 这样就可以使用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());
答案 1 :(得分:0)
您需要做的是为每个invoke()JExpression调用存储一个中间值:
JExpression rhsAssignmentExpression = JExpr._new(refArrayList);
for(String methodName : methodsToInvoke) {
rhsAssignmentExpression = rhsAssignmentExpression.invoke(methodName).arg(JExpr._new(refObject));
}
这避免了每次重新定义调用,并有效地链接调用。结果如下:
public class GeneratedClass {
public ArrayList objects;
public ArrayList getNewObjectList() {
objects = new ArrayList().add(new Object()).add(new Object()).add(new Object());
return objects;
}
}