使用metaClass覆盖Groovy中的ArrayLists的方法

时间:2014-01-01 18:14:51

标签: groovy arraylist metaprogramming

我试图理解为什么我不能修改任何使用元编程的方法对ArrayList的任何实例的行为。这是我用于的代码:

ArrayList.metaClass.contains = { Object o -> true }
def list = ['hi','hallo']
assert list instanceof ArrayList
assert list.contains('hola')

但是它不起作用,它会引发一个例外,抱怨第4行,因为列表不包含'hola'。

有关它的任何线索?

如果你问为什么我需要这样做,只是因为我正在编写一些单元测试,我需要修改contains方法的行为来抛出异常。

2 个答案:

答案 0 :(得分:1)

我试图理解为什么我不能使用元编程为任何ArrayList 实例修改任何方法的行为。 - 您的陈述与您尝试的内容不同步。 :)。您正在Class上应用metaClass而不是实例本身。

ArrayList是一个Java类,当您尝试访问metaClass(在Class本身上)并添加一个类似于已存在的新方法时,它将引用已存在的method在课堂上。

相反,尝试在实例上添加contains方法:

def list = ['hi','hallo']
list.metaClass.contains = { Object o -> true }

assert list instanceof ArrayList
assert list.contains('hola')

如果要使用ArrayList类,请更改方法的名称:

ArrayList.metaClass.containssss = { Object o -> true }
def list = ['hi','hallo']
assert list instanceof ArrayList
assert list.containssss('hola')

答案 1 :(得分:1)

我真的不知道为什么,但这可行(只是使用闭包的类型化参数):

ArrayList.metaClass.contains = { String o -> true } 
def list = ['hi','hallo'] 
assert list instanceof ArrayList 
assert list.contains('hola')​