从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
歧义,则需要进一步检查。
- java比较两个日期
- java.lang.OutOfMemoryError:PermGen空间
- 扫描仪(System.in) – 如何取消/跳过输入等待
- Hibernate 5.2.7 – java.lang.NoSuchMethodError:org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava / util / Map;
- 使用字符串方法查找和计算字符串中的元音?
- 在java中尝试使用资源和返回语句
- JSF 2.0:如何在使用HttpServletRequest.login后重定向到受保护的页面
- Eclipse – 查看一个类的哪些方法在另一个类中使用?
- IllegalArgumentException:颜色参数超出预期范围:红绿蓝