我有一个应用程序,其中包含一些用于编程配置的EL评估。给定一个EL表达式,我想要得到它包含的自由变量,而不是实际计算它。其目的是提供一个UI,最终用户可以在按下"evaluate“按钮之前将值绑定到自由变量。
不幸的是,javax.el.ValueExpression不提供此功能,因此我可能需要使用特定于供应商的API。这是相当早期的开发,所以我还没有确定我的实现选择。我想过MVEL,JUEL和SpEL,但当然我选择的任何东西都应该具有我上面描述的功能。
发布于 2012-08-13 06:03:52
MVEL的ParserContext可以告诉您所有由局部变量和输入组织的变量。
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"));发布于 2012-08-06 22:04:51
这个怎么样..。
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;
}发布于 2012-11-08 01:19:06
Gary的答案是好的,但当表达式包含单个变量时,例如"#var“(一个没有子节点的节点),它不适用于我。一个小小的改变:
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;
}https://stackoverflow.com/questions/11828778
复制相似问题