динамический вызов метода с аргументами в groovy - PullRequest
0 голосов
/ 02 ноября 2011

Для простоты, скажем, у меня есть код, подобный этому:

def testMethod(String txt) {
    return txt;
}
public String evaluate(String expression) {
    //String result = "${testMethod('asdasdasd')}";
    String result = "${expression}";
    return result;
}

Мне нужно, чтобы значение выражения, которое передается методу "оценивать", было выполнено.

при звонке

// everything works perfectly well,
String result = "${testMethod('samplestring')}"; 

при звонке

// (when expression = testMethod) - everything works perfectly well,
String result = "${expression}"("samplestring"); 

в случае звонка

// (when expression = testMethod('samplestring'))  - it's not working.
// I see testMethod('samplestring') as the result, but I need it to be evaluated.
String result = "${expression}" 

Как я могу это сделать? Спасибо.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Так должно работать;

Eval.me( "${expression}" )

Редактировать

Как указывалось, это не будет работать в том виде, в каком оно есть, вам нужно передать скрипт, содержащий метод, с Eval.x примерно так:

def testMethod(String txt) {
    txt
}

public String evaluate(String expression) {
    String result = Eval.x( this, "x.${expression}" )
    result
}

println evaluate( "testMethod('samplestring')" )

Это напечатает samplestring

0 голосов
/ 02 ноября 2011

Вы можете использовать класс GroovyShell для этой цели, но вам нужно будет определить Binding AFAIK.Это работает в Groovy Console:

def testMethod(txt) {
    "$txt!";
}

def evaluate(String expression) {
    def binding = new Binding(['testMethod': testMethod])
    new GroovyShell(binding).evaluate(expression)
}

evaluate('testMethod("Hello World")');
...