java - 定义和重用 MVEL 函数

标签 java function embedding evaluation mvel

是否可以使用 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/

相关文章:

java - 如何获得对 JavaFX 图表的低级别访问以便绘制图像?

google-chrome - 在Safari中嵌入youtube视频不起作用

nlp - 手套嵌入中的标记和词汇意味着什么?

java - iText 签名表单字段内容未打印在纸上

java - 为什么 Maven 不运行测试用例?

swift - Swift 3.1 中#function 文字的奇怪值

function - Haskell 中与(高阶)函数的模式匹配

php - 基本邮件功能(PHP)附加 "-f"参数问题

c++ - C++ 中的 Python : Unresolved external

java - 在Java(j2me)中更改 vector 中的整数的正确方法是什么