用元类重写Groovy中的ArrayList方法

用元类重写Groovy中的ArrayList方法,groovy,arraylist,metaprogramming,Groovy,Arraylist,Metaprogramming,我试图理解为什么我不能对ArrayList的任何实例使用元编程来修改任何方法的行为。这是我正在使用的代码: ArrayList.metaClass.contains = { Object o -> true } def list = ['hi','hallo'] assert list instanceof ArrayList assert list.contains('hola') 但它不起作用,它抛出一个异常,抱怨第4行,因为列表不包含“hola” 有什么线索吗 如果您问我为什么需要

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

ArrayList.metaClass.contains = { Object o -> true }
def list = ['hi','hallo']
assert list instanceof ArrayList
assert list.contains('hola')
但它不起作用,它抛出一个异常,抱怨第4行,因为列表不包含“hola”

有什么线索吗

如果您问我为什么需要这样做,那只是因为我正在编写一些单元测试,并且我需要修改contains方法的行为以引发异常。

我试图理解为什么我不能使用元编程来修改任何ArrayList实例的任何方法的行为您的声明与您尝试执行的操作不同步。:)。您正在类上而不是实例本身上应用元类

ArrayList
是一个Java类,当您尝试访问元类(在类本身上)并添加一个类似于已经存在的方法的新方法时,它将引用类中已经存在的
方法

相反,请尝试在实例本身上添加
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')

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


但问题是,我必须修改方法中实例的行为,而我不能直接从测试中访问该方法。我不明白为什么我可以修改,例如,该方法对于类字符串是空的,但对于ArrayList类不是空的。在邮件列表中也尝试过。
ArrayList.metaClass.contains = { String o -> true } 
def list = ['hi','hallo'] 
assert list instanceof ArrayList 
assert list.contains('hola')​