我试图理解为什么我不能修改任何使用元编程的方法对ArrayList的任何实例的行为。这是我用于的代码:
ArrayList.metaClass.contains = { Object o -> true }
def list = ['hi','hallo']
assert list instanceof ArrayList
assert list.contains('hola')
但是它不起作用,它会引发一个例外,抱怨第4行,因为列表不包含'hola'。
有关它的任何线索?
如果你问为什么我需要这样做,只是因为我正在编写一些单元测试,我需要修改contains方法的行为来抛出异常。
答案 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')