是否可以使用 MVEL 定义一些自定义预编译函数并在另一个编译表达式中使用一个函数? 如果我尝试以下操作:
MVEL.compileExpression("function hello() { System.out.println(\"Hello!\"); hello(); return x * y;");
当我第二次尝试执行它时,我得到 Exception in thread "main"[Error: duplicate function: hello]
。
看起来我不应该在表达式本身,而是在某种上下文中声明函数。我使用 ParsedContext 玩了一段时间,但总是在线程“main”中出现 Exception [错误:无法访问属性(null parent):你好]
。
互联网上充满了涵盖不同 MVEL 语言使用主题的教程,但此类嵌入主题的文档却很少。你能告诉我我做错了什么吗?
附言我不想从 Java 执行某些功能。我需要使用 MVEL 动态定义它们。
最佳答案
这比一些常见的用例要复杂一些,尽管这是可能的。
基本上,您需要做的是创建一个脚本来定义您的函数,如下所示:
VariableResolverFactory functionFactory = new MapVariableResolverFactory();
MVEL.eval("def foo() { System.out.println("foo"); }; def bar() { System.out.println("bar") };", functionFactory);
然后,您要做的是将这个工厂反向链接到您运行的任何表达式:
VariableResolverFactory myVarFactory = new MapVariableResolverFactory();
myVarFactory.setNextFactory(functionFactory);
Serializable s = MVEL.compileExpression("foo(); bar();");
MVEL.executeExpression(s, myVarFactory);
函数被记录为变量表上的引用,因此您可以使用常规变量工厂反向链接在 MVEL 中共享它们。
注意:您不应该重新共享“myVarFactory”。你想每次都创建一个新的。您只想回收“functionFactory”并将其反向链接到如上所示的每次运行工厂。否则,您最终将在执行之间共享本地 var 状态——这不是线程安全的
关于java - 定义和重用 MVEL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641197/