如何从MVEL表达式中调用外部方法?

时间:2015-12-04 11:05:41

标签: mvel

我有一个有两种方法的JAVA类。第一个是main方法,第二个是method1()。

让我们说以下是班级:

Exception in thread "main" [Error: no such method or function: method1]
[Near : ... main method"); method1(); ..}]
                                    ^
[Line: 1, Column: 184]
at org.mvel2.PropertyAccessor.getMethod(PropertyAccessor.java:898)
at org.mvel2.PropertyAccessor.getNormal(PropertyAccessor.java:182)
at org.mvel2.PropertyAccessor.get(PropertyAccessor.java:146)
at org.mvel2.PropertyAccessor.get(PropertyAccessor.java:126)
at org.mvel2.ast.ASTNode.getReducedValue(ASTNode.java:187)
at org.mvel2.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:106)
at org.mvel2.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:49)
at org.mvel2.MVEL.eval(MVEL.java:136)
at mypackage.SomeClass.main(SomeClass.java:15)

现在,当我运行程序时,我得到以下输出: -

我在主要方法

>plot(df_ricos[,1],df_ricos[,3],col=df_ricos[,4])

正如您所看到的,它打印出第一个sop,但是当调用method1时,它会抛出异常。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

您需要在通过group by进行评估时传递类对象。

1。)创建MVEL

2.。SomeClass已添加到map.put("obj", myObj);

3。)HashMap需要评估

MVEL.eval(exp,map)

<强>输出

public static void main(String[] args) {
        SomeClass myObj = new SomeClass();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("obj", myObj);
        MVEL.eval("System.out.println(\"I am inside main method\");obj.method1();",map);
    }

    public static void method1() {
        System.out.println("I am inside method 1");
    }

答案 1 :(得分:2)

有两种方法可以在MVEL中调用您自己的方法。第一种方式就像@Ankur Singhal的答案。另一种方法是使用ParserContext。

这是班级

public class CalcHelper {
    public static int add(int a, int b){
        return a + b;
    }
}

使用ParserContext将类导入到MVEL。

ParserContext parserContext = new ParserContext();
parserContext.addImport(CalcHelper.class.getSimpleName(), CalcHelper.class);

然后您可以在表达式中调用Class的静态方法。

Serializable s = MVEL.compileExpression("CalcHelper.add(1,2)", parserContext);
MVEL.executeExpression(s, parserContext);