首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JCodeModel -如何链接调用方法

JCodeModel -如何链接调用方法
EN

Stack Overflow用户
提问于 2014-03-20 18:10:30
回答 2查看 1.9K关注 0票数 3

我试图弄清楚如何使用一个循环来构建一个JExpression,我可以在一个.assign()调用中使用它。我知道您可以使用JExpr.invoke("methodA").invoke("methodB")进行类似JCodeModel的操作,但我希望能够根据方法名称列表添加每个.invoke()方法。有人知道怎么做吗?

我的生成器代码示例--这是假设我已经修改了ArrayList.add()方法以返回ArrayList:

代码语言:javascript
复制
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);

例如,我试图生成的内容:

代码语言:javascript
复制
class GeneratedClass {

   ArrayList<Object> objects;

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

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

代码语言:javascript
复制
class GeneratedClass {

   ArrayList<Object> objects;

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-21 01:38:22

您需要做的是为每个调用() JExpression调用存储一个中间值:

代码语言:javascript
复制
JExpression rhsAssignmentExpression = JExpr._new(refArrayList);
for(String methodName : methodsToInvoke) {
    rhsAssignmentExpression = rhsAssignmentExpression.invoke(methodName).arg(JExpr._new(refObject));
}

这避免了每次重新定义调用,并有效地锁住了调用。结果如下:

代码语言:javascript
复制
public class GeneratedClass {

    public ArrayList objects;

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

}
票数 0
EN

Stack Overflow用户

发布于 2014-03-20 18:42:04

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22541640

复制
相关文章

相似问题

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