Java println在Groovy中不使用重写的toString方法
我已为我的对象重写了Java println在Groovy中不使用重写的toString方法,java,groovy,Java,Groovy,我已为我的对象重写了toString(): class GroovyTest { static class TestObject { int a = 3 } static main(def s) { TestObject.metaClass.toString = { -> 'silly'} println new TestObject() } } 忽略我的自定义toString()它使用默认的toStr
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
这是为什么?在Groovy中重写方法时,实际上并不是在修改类的Java字节码。您的方法将被添加到
元类
注册表中。拦截对对象的方法调用,并检查元类
当一个Groovy对象被传递给Java代码时,它将失去所有的Groovity特性,成为一个POJO
,因为方法拦截和元类检查不会在那里发生。看这个
println
在内部使用System.out.println
,它绕过Groovy方法拦截并调用Object.toString()
当您在Groovy中重写一个方法时,实际上并没有修改该类的Java字节码。您的方法将被添加到元类
注册表中。拦截对对象的方法调用,并检查元类
当一个Groovy对象被传递给Java代码时,它将失去所有的Groovity特性,成为一个POJO
,因为方法拦截和元类检查不会在那里发生。看这个
println
在内部使用System.out.println
,它绕过Groovy方法拦截并调用Object.toString()