首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出EL表达式中的自由变量

列出EL表达式中的自由变量
EN

Stack Overflow用户
提问于 2012-08-06 20:58:54
回答 3查看 1.1K关注 0票数 1

我有一个应用程序,其中包含一些用于编程配置的EL评估。给定一个EL表达式,我想要得到它包含的自由变量,而不是实际计算它。其目的是提供一个UI,最终用户可以在按下"evaluate“按钮之前将值绑定到自由变量。

不幸的是,javax.el.ValueExpression不提供此功能,因此我可能需要使用特定于供应商的API。这是相当早期的开发,所以我还没有确定我的实现选择。我想过MVEL,JUEL和SpEL,但当然我选择的任何东西都应该具有我上面描述的功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-13 06:03:52

MVEL的ParserContext可以告诉您所有由局部变量和输入组织的变量。

代码语言:javascript
复制
ParserContext ctx = ParserContext.create();
MVEL.analysisCompile("a = 0; b = 0;", ctx);

HashMap<String, Class> vars = ctx.getVariables();

assert vars.containsKey("a") && Number.class.isAssignableFrom(vars.get("a"));
assert vars.containsKey("b") && Number.class.isAssignableFrom(vars.get("b"));
票数 1
EN

Stack Overflow用户

发布于 2012-08-06 22:04:51

这个怎么样..。

代码语言:javascript
复制
    SpelExpression parseExpression = (SpelExpression) new SpelExpressionParser().parseExpression(expressionString);
    SpelNode node = parseExpression.getAST();
    List<String> vars = getVars(node);

...


private List<String> getVars(SpelNode node) {
    List<String> vars = new ArrayList<String>();
    for (int i = 0; i < node.getChildCount(); i++) {
        SpelNode child = node.getChild(i);
        if (child.getChildCount() > 0) {
            vars.addAll(getVars(child));
        }
        else {
            if (child instanceof VariableReference) {
                vars.add(child.toStringAST());
            }
        }
    }
    return vars;
}
票数 3
EN

Stack Overflow用户

发布于 2012-11-08 01:19:06

Gary的答案是好的,但当表达式包含单个变量时,例如"#var“(一个没有子节点的节点),它不适用于我。一个小小的改变:

代码语言:javascript
复制
private Set<String> getVars(SpelNode node) {
    Set<String> vars = new HashSet<String>();
    if (node == null) {
        return vars;
    }

    if (node instanceof VariableReference) {
        // Remove the "#" to get the actual variable name
        vars.add(StringUtils.remove(node.toStringAST(), "#"));
    }

    for (int i = 0; i < node.getChildCount(); i++) {
        SpelNode child = node.getChild(i);
        vars.addAll(getVars(child));
    }

    return vars;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11828778

复制
相关文章

相似问题

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