代码之家  ›  专栏  ›  技术社区  ›  IttayD

我可以重新定义字符串长度吗?

  •  7
  • IttayD  · 技术社区  · 16 年前

    "hi".length() 返回 4 . (怎么)我能做到吗?

    我知道使用SomeClass.metaClass类我可以获取对现有方法的引用并定义新的(或重写的)方法,但对于现有的Java方法,我似乎无法做到这一点。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Riduidel    16 年前

    看来有可能 abusing metaClass

    def oldLength = String.metaClass.length
    String.metaClass.length = { ->
        return oldLength+10;
    }
    
    println "hi".length()
    

    输出sad 2

    Proxy MetaClass Delegating metaClass .

        2
  •  4
  •   Dónal    16 年前

    这是你要求的例子,即如何 String.length() 始终返回4

    // Redefine the method
    String.metaClass.invokeMethod = { name, args ->
    
        def metaMethod = delegate.metaClass.getMetaMethod(name, args)
        def result = metaMethod.invoke(delegate, args)
    
        name == 'length' ? 4 : result
    }
    
    // Test it
    assert "i_do_not_have_4_chars".length() == 4
    
        3
  •  1
  •   noah    16 年前

    如果您重新定义了它,它将只在Groovy代码中工作。Groovy不能改变Java代码的执行方式。

    "hi".length()

    stringMetaClass.invokeMethod("hi","length");
    

    因为Groovy实际上并不直接调用length,所以元类技巧在Groovy代码中起作用。但是Java不知道元类,所以没有办法实现这一点。