我已为我的对象覆盖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
为什么会这样?
答案 0 :(得分:4)
在Groovy中覆盖方法时,实际上并没有修改类的Java字节代码。您的方法将添加到metaClass
注册表。拦截对象的方法调用并检查metaClass
。
当Groovy对象传递给Java代码时,它将失去所有的Grooviness并成为POJO
因为方法拦截和metaClass
检查不会在那里发生。请参阅此post。
println
在内部使用System.out.println
绕过Groovy方法拦截并调用Object.toString()
。