groovy - 使用元类重写 Groovy 中 ArrayList 的方法

标签 groovy arraylist metaprogramming

我试图理解为什么我无法使用元编程对 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/

相关文章:

python - 在 Rexster 中测试从 Groovy 命令行创建顶点

java - 选定的组合框值两次添加到数组列表中

java - 我有一套配料。我需要在 Java 中检索包含这些成分的所有食谱

c++ - 模板类和可能的性能问题

ruby - 你如何在父类中打开一个类而不影响 ruby​​ 中的其他子类实例

groovy - Jenkins 使用 groovy 为作业添加权限

Grails 自动重新加载新的 Controller Action

r - 在 R 中,如何使用 quote 或 bquote 引用注释?

java - Intellij 编辑器因 stackoverflow 而卡住

java - 如何过滤自定义ArrayList