繁体   English   中英

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

[英]Get variables from javascript expression (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, "<cmd>", 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<String> names = new HashSet<String>();
    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, "<cmd>", 1);
    node.visit(new Visitor());
    System.out.println(names);
  }
}

输出:

[V1ND, abs, Math]

但是,我不确定这是否会大大提高效率,除非表达式适合缓存。 您将解析两次代码,如果需要从Math函数上Math变量abs ,则需要进一步检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM