проблема в этом коде:
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate("targetClass.getMethod(\"f\", int.class, int.class).invoke(targetInstance, 2, 9);");
когда вы вызываете shell.evaluate
представьте, что вы вызываете абсолютно новый класс, который ничего не знает о ваших текущих переменных, таких как targetClass
так, GroovyShell
говорит о том, что такого свойства нет: targetClass
чтобы исправить это - нужно просто заполнить привязку - передать значения и имена переменных, которые должны быть видны внутри shell.evaluate(...)
.
Binding binding = new Binding();
binding.setVariable("target", targetClass) //pass targetClass as target variable name
binding.setVariable("instance", targetInstance)
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate("target.getMethod(\"f\", int.class, int.class).invoke(instance, 2, 9)");
еще один момент - groovy - это уже динамический язык, и вы можете упростить свой вложенный скрипт из этого:
target.getMethod("f", int.class, int.class).invoke(instance, 2, 9)
к этому:
instance."f"(2, 9)
и, наконец, возможно, вам не нужно использовать groovyshell, потому что следующий код динамически вызывает метод:
class A{
def f(int a, int b){ a+b }
}
def instance = new A()
def method = "f"
def params = [2,9]
println instance."${method}"(params)