我正在用JCodeModel生成Java源代码,并希望得到这样一个“if- an”块:
if (foo){
} else if (bar) {
}据我所知,相应的代码应该是这样的(其中m是一个JMethod):
JConditional cond = m.body()._if(JExpr.direct("foo"));
cond._elseif(JExpr.direct("bar"));似乎是直截了当的,但结果是:
if (foo) {
} else {
if (bar) {
}
}你看到了句法上的不同,其实这并不是“其他”。在语义上它是一样的,我知道,但是我需要像前面所示的那样生成它(它是教育软件的一部分)。有什么办法吗?
发布于 2013-01-14 09:10:28
不幸的是,由于JConditional的实现,您不能使用它来完成这个任务。查看方法_elseif的来源
public JConditional _elseif(JExpression boolExp) {
return _else()._if(boolExp);
}如您所见,这个方法只是在内部调用_else(),然后调用_if。
实际上,_else()是JBlock,默认情况下它包含braces ({ ... })。JBlock的这个属性可以手动关闭而不是,因为它不包含这样的setter。只有通过braces的特殊构造函数才能关闭JBlock:
public JBlock(boolean bracesRequired, boolean indentRequired) {
this.bracesRequired = bracesRequired;
this.indentRequired = indentRequired;
}但是,您无法将自己的对象设置为_else字段的JConditional对象。
唯一的方法是复制JConditional类实现并生成您自己的类,这将允许您进行这样的代码操作。
UPD:当然,您可以使用Reflection作为解决办法,手动将_else对象的标志bracesRequired切换到false。
https://stackoverflow.com/questions/14315139
复制相似问题