我试图理解为什么我无法使用元编程对 ArrayList 的任何实例修改任何方法的行为。这是我使用的代码:
ArrayList.metaClass.contains = { Object o -> true }
def list = ['hi','hallo']
assert list instanceof ArrayList
assert list.contains('hola')
但是它不起作用,并且会抛出一个异常,提示第 4 行,因为 list 不包含“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')
关于groovy - 使用元类重写 Groovy 中 ArrayList 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20871689/