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);