有没有可能用MVEL定义一些自定义的预编译函数,然后在另一个编译表达式中使用?如果我尝试执行以下操作:
MVEL.compileExpression("function hello() { System.out.println(\"Hello!\"); hello(); return x * y;");当第二次尝试执行它时,我得到了Exception in thread "main" [Error: duplicate function: hello]。
看起来我不应该在表达式本身声明函数,而应该在某种上下文中声明。我玩过一段时间的ParsedContext,但总是用Exception in thread "main" [Error: unable to access property (null parent): hello]。
互联网上充斥着涵盖不同MVEL语言使用主题的教程,但此类嵌入主题的文档非常少。你能告诉我我做错了什么吗?
附言:我不想执行Java中的某些函数。我需要用MVEL动态地定义它们。
发布于 2012-09-29 08:58:39
这比一些常见的用例要棘手一些,尽管它是可能的。
基本上,您需要做的是创建一个脚本来定义您的函数,如下所示:
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状态--这不是线程安全的
https://stackoverflow.com/questions/12641197
复制相似问题