首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义和重用MVEL函数

定义和重用MVEL函数
EN

Stack Overflow用户
提问于 2012-09-28 21:42:29
回答 1查看 7.3K关注 0票数 1

有没有可能用MVEL定义一些自定义的预编译函数,然后在另一个编译表达式中使用?如果我尝试执行以下操作:

代码语言:javascript
复制
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动态地定义它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-29 08:58:39

这比一些常见的用例要棘手一些,尽管它是可能的。

基本上,您需要做的是创建一个脚本来定义您的函数,如下所示:

代码语言:javascript
复制
VariableResolverFactory functionFactory = new MapVariableResolverFactory();
MVEL.eval("def foo() { System.out.println("foo"); }; def bar() { System.out.println("bar") };", functionFactory);

然后,您要做的是将此工厂反向链接到您运行的任何表达式:

代码语言:javascript
复制
VariableResolverFactory myVarFactory = new MapVariableResolverFactory();
myVarFactory.setNextFactory(functionFactory);

Serializable s = MVEL.compileExpression("foo(); bar();");

MVEL.executeExpression(s, myVarFactory);

函数被记录为变量表上的引用,因此您可以使用常规的变量工厂回链在MVEL中共享它们。

注意:你不应该重新分享'myVarFactory‘。您希望每次都创建一个新的。您只需要回收“functionFactory”并将其反向链接到每次运行的工厂,如上图所示。否则,您最终将在执行之间共享本地var状态--这不是线程安全的

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12641197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档