代码之家  ›  专栏  ›  技术社区  ›  M. Jessup

移除单个元类方法

  •  7
  • M. Jessup  · 技术社区  · 16 年前

    我已经开始学习groovy,目前正在研究元类功能。我已经看到了添加新方法和删除所有方法的示例,但没有看到删除单个方法的示例。例如:

    String.metaClass.foo = {delegate.toUpperCase()}
    String.metaClass.bar = {delegate.toLowerCase()}
    

    副作用明显。现在我看到你可以说

    String.metaClass = null
    

    删除所有方法。我希望有人能按照

    String.metaClass.foo = null
    

    删除string.foo(),但保留string.bar(),但此语句似乎没有任何效果。有没有一种方法可以说在不影响bar()或任何其他添加的方法的情况下,不再定义方法foo()?

    2 回复  |  直到 11 年前
        1
  •  7
  •   Dónal    16 年前

    如果你搜索 this webpage 对于“remove method”,它表示您应该能够使用上面提出的确切语法删除方法。但我测试过了,你说得对,好像不起作用。

    解决方法是指定一个抛出 MissingMethodException ,这是默认情况下调用不存在的方法时所发生的情况,例如

    // Add method
    String.metaClass.foo = {delegate.toUpperCase()}
    
    // Remove method
    def removeMethod = {throw new MissingMethodException()}
    String.metaClass.foo = removeMethod
    

    诚然,这不是最令人满意的解决方案。

        2
  •  2
  •   brunobowden Dipak Keshariya    11 年前

    接下来,我在这里发布了一个bug报告:

    https://issues.apache.org/jira/browse/GROOVY-4189

    文件现在已经更改了

    查看错误报告,原因是它从未实现

    唐的回答是最好的解决办法