2015-09-24 122 views
0

我正在编写粘贴到基于Web的系统运行的Groovy脚本。有一个 类可用于在此环境中运行的脚本,我将其称为BrokenClass。它有一个 错误,它只接受字符串文字作为其第一个参数,但不包含其中包含字符串的变量 。因此,这将工作(它返回一个列表):有没有办法在eval中调用类方法?

BrokenClass.reflist('something', 'name') 

但是,如果我尝试使用一个变量作为第一个参数我得到一个错误:

list_name = 'something' 
BrokenClass.reflist(list_name, 'name') 

这将产生该消息Metadata RefList[something] cannot be accessed

我对BrokenClass没有任何控制权(除了提交它的bug)。我想工作 围绕问题是这样的:

list_name = "foo" 
list_call = "BrokenClass.reflist(${list_name}, 'name')" 
list_values = Eval.me(list_call) 

然而,这会产生一个错误:

groovy.lang.MissingPropertyException: No such property: BrokenClass for class: Script1 

我尝试添加一个import到我的字符串,但后来我得到unable to resolve class BrokenClass

有没有办法在eval'd字符串中使用BrokenClass?或者我还没有其他方式 认为解决了BrokenClass.reflist中的bug?一个非常长的switch块 已经不存在,因为可能的列表名称会更改。

方法签名BrokenClass.reflist是:

public static List<Object> reflist(String reflistName, String field); 
+0

你能看到BrokenClass的源代码吗? –

+0

不,我不是。该课程以及整个基于网络的系统,或由不同的小组控制。 – khagler

+0

BrokenClass.reflist()的方法签名是什么? –

回答

1

我有一个怀疑,BrokenClass.reflist()直接或间接地操作的方式,通过使用==运算符,而不是String.equals()不适当的字符串比较。有关差异的解释,请参阅this文章。

问题

这里的问题的演示:

def a = 'whatever' 
def b = 'what' + 'ever' 

assert doSomething('whatever') == 'OK' 
assert doSomething(a) == 'OK' 
assert doSomething(b) == 'ERROR' 

def doSomething(String value) { 
    if(value.is('whatever')) { // In Java this would be: value == "whatever" 
     'OK' 
    } else { 
     'ERROR' 
    } 
} 

因为它使用引用相等,这在Groovy是由Object.is(Object)方法来完成,BrokenClass.reflist()无意中编码仅与字符串文字工作:具有相同值的所有字符串文字都引用相同的String实例,从而得出对True的评估。在运行时使用相同的文字值创建的字符串不会引用相同的String实例。

各地

显然BrokenClass.reflist()工作应该是固定的。但是,您可以通过使用字符串来解决此问题。

def b = 'what' + 'ever' 

assert doSomething(b.intern()) == 'OK' 

def doSomething(String value) { 
    if(value.is('whatever')) { 
     'OK' 
    } else { 
     'ERROR' 
    } 
} 

如果变量的值相匹配的字符串文字,那么variable.intern()将返回相同的字符串实例作为匹配文字。这将允许Java ==操作符根据需要工作。

+0

确实解决了这个问题。谢谢! – khagler

相关问题