println在Groovy中不使用overriden toString方法

时间:2014-06-05 06:09:19

标签: java groovy

我已为我的对象覆盖toString()

class GroovyTest {
    static class TestObject {
        int a = 3
    }
    static main(def s) {
        TestObject.metaClass.toString = { -> 'silly'}   
        println new TestObject()
    }
}

忽略我的自定义toString(),它使用默认的toString()并打印:

GroovyTest$TestObject@195ed659

但是,如果我像println new TestObject().toString()一样手动调用它,它可以工作:

Silly

为什么会这样?

1 个答案:

答案 0 :(得分:4)

在Groovy中覆盖方法时,实际上并没有修改类的Java字节代码。您的方法将添加到metaClass注册表。拦截对象的方法调用并检查metaClass

当Groovy对象传递给Java代码时,它将失去所有的Grooviness并成为POJO因为方法拦截和metaClass检查不会在那里发生。请参阅此post

println在内部使用System.out.println绕过Groovy方法拦截并调用Object.toString()