Parsing 失败的Eval.me搜索不在其所在类中的字段

Parsing 失败的Eval.me搜索不在其所在类中的字段,parsing,gradle,groovy,eval,Parsing,Gradle,Groovy,Eval,我正在尝试读取具有解析名称的变量的值: class GatewayFunctionBuilder{ private String responseClass ..... String target = 'esponse' println "writing r${target}Class" println responseClass String targetClass = Eval.me("r${target}Class") 结果是: writi

我正在尝试读取具有解析名称的变量的值:

class GatewayFunctionBuilder{
    private String responseClass
    .....
    String target = 'esponse'
    println "writing r${target}Class"
    println responseClass
    String targetClass = Eval.me("r${target}Class")
结果是:

writing responseClass
MWFtest0A1Response
:application:generateJavaFromTestMwf FAILED

FAILURE: Build failed with an exception.

* Where:
Script 'C:\Users\543829657\workspace\dev.appl.ib.cbl\application\Xml2Java.gradle' line: 53

* What went wrong:
Execution failed for task ':application:generateJavaFromTestMwf'.
> No such property: responseClass for class: Script1
打印变量的内容是正确的。但是,Eval.me似乎不是在调用它的类中搜索responseClass字段,而是从Gradle任务脚本中搜索

如果我将此对象作为参数传递,它将起作用:

String targetClass = Eval.x(this, "x.r${target}Class")
但这并没有任何逻辑,因为这也不是任务脚本的一个字段,而是一些只对该类的一个实例有正确意义的东西。即使该实例是作为局部变量在任务脚本中创建的,它也有其他名称

我在Eval文档中没有看到任何提及,它在一些Script1的上下文中计算字符串。Groovy 2.4.4中Eval的代码是。我们注意到以下几点:

class Eval { ...
public static Object me(final String expression) throws CompilationFailedException {
    return me(null, null, expression);
}
以及:

因此,可以在纯Groovy中复制该行为,而无需Gradle:

// Eval.me(expression) == Eval.me(null, null, expression)
def symbol = null
def object = null
def responseClass = "hello"
def target = "esponse"
def expression = "r${target}Class"

def b = new Binding();
b.setVariable(symbol, object);
def sh = new GroovyShell(b);
println sh.evaluate(expression);

显然在绑定对象中找不到表达式。

为什么表达式应该在绑定中?绑定保存外部系统和用户变量。就像eval实际上只启动GroovyShell.evaluate一样,它不知道调用它的类或实例。您已经解释了问题是如何发生的。它们只是用最简单的方法制作的。对他们来说很容易,但对用户来说并不容易。
// Eval.me(expression) == Eval.me(null, null, expression)
def symbol = null
def object = null
def responseClass = "hello"
def target = "esponse"
def expression = "r${target}Class"

def b = new Binding();
b.setVariable(symbol, object);
def sh = new GroovyShell(b);
println sh.evaluate(expression);