Как вызвать внешний метод из выражения MVEL?

У меня есть класс JAVA с двумя методами. Первый — это основной метод, а второй — метод1().

Скажем, следующий класс:

public class SomeClass() {
  public static void main(String[] args){
    MVEL.eval("System.out.println(\"I am inside main method\");method1();");
  }
  public static void method1(){
    System.out.println("I am inside method 1");
  }
}

Теперь, когда я запускаю программу, я получаю следующий вывод: -

Я внутри основного метода

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)

Как видите, он печатает первую подачку, но когда дело доходит до вызова метода1, он выдает исключение.

Есть ли способ решить эту проблему?


person Anuj    schedule 04.12.2015    source источник
comment
@MikeBrock Не могли бы вы мне помочь?   -  person Anuj    schedule 04.12.2015
comment
@bradhouse: Не могли бы вы сообщить мне, возможно ли это вообще?   -  person Anuj    schedule 04.12.2015
comment
@ankur-singhal предоставил ответ, который мне подходит, но я не могу проголосовать за него (кажется, мне нужно набрать около 15 очков репутации)   -  person Anuj    schedule 07.12.2015


Ответы (2)


Вам нужно передать объект класса при оценке через MVEL.

1.) SomeClass создан

2.) map.put("obj", myObj); добавлено к HashMap

3.) 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");
    }

вывод

I am inside main method
I am inside method 1
person Ankur Singhal    schedule 04.12.2015
comment
я уже сделал это, но это не отражает .. я здесь новичок. Похоже, мне нужно набрать 15 баллов (репутация) или что-то в этом роде, чтобы мой голос был виден публике.. - person Anuj; 07.12.2015
comment
Если я хочу добавить аргументы в метод1(), где аргументы будут доступны мне во время выполнения. как это сделать? Является ли это возможным? - person Anuj; 08.12.2015
comment
@Anuj Лучше, как известный вопрос с полной информацией о самом вопросе, а не с комментариями. - person Ankur Singhal; 08.12.2015
comment
Сделанный. stackoverflow.com/questions/34150207/ - person Anuj; 08.12.2015
comment
Мне нужна помощь. Ты там? - person Anuj; 08.01.2016

Есть два способа вызвать собственный метод в 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);

Затем вы можете вызвать статический метод класса в своем выражении.

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