从javascript表达式获取变量(Rhino)

我正在使用Rhino来评估js表达式,方法是将所有可能的变量值放在作用域中并评估匿名函数。 然而,表达式相当简单,我想只将表达式中使用的值放在表达式中。

代码示例:

Context cx = Context.enter(); Scriptable scope = cx.initStandardObjects(null); // Build javascript anonymous function String script = "(function () {" ; for (String key : values.keySet()) { ScriptableObject.putProperty(scope, key, values.get(key)); } script += "return " + expression + ";})();"; Object result = cx.evaluateString(scope, script, "", 1, null); 

我想从变量名称的表达式中获取所有标记。

例如,如果表达式是

 (V1ND < 0 ? Math.abs(V1ND) : 0) 

它将返回V1ND

Rhino 1.7 R3引入了一个AST包 ,可用于查找名称:

 import java.util.*; import org.mozilla.javascript.Parser; import org.mozilla.javascript.ast.*; public class VarFinder { public static void main(String[] args) throws IOException { final Set names = new HashSet(); class Visitor implements NodeVisitor { @Override public boolean visit(AstNode node) { if (node instanceof Name) { names.add(node.getString()); } return true; } } String script = "(V1ND < 0 ? Math.abs(V1ND) : 0)"; AstNode node = new Parser().parse(script, "", 1); node.visit(new Visitor()); System.out.println(names); } } 

输出:

 [V1ND, abs, Math] 

但是,我不确定这对效率有多大帮助,除非表达式适合缓存。 您将解析代码两次,如果您需要消除Math函数中的变量abs歧义,则需要进一步检查。