[英]println does not use overriden toString method in Groovy
I have overriden toString()
for my object: 我已经为我的对象重写了
toString()
:
class GroovyTest {
static class TestObject {
int a = 3
}
static main(def s) {
TestObject.metaClass.toString = { -> 'silly'}
println new TestObject()
}
}
Ignoring my custom toString()
it uses the default toString()
and prints: 忽略我的自定义
toString()
它将使用默认的toString()
并打印:
GroovyTest$TestObject@195ed659
However if I manually invoke it like println new TestObject().toString()
it works: 但是,如果我像
println new TestObject().toString()
这样手动调用它,它将起作用:
Silly
Why is this? 为什么是这样?
When you override a method in Groovy you are not actually modifying the Java byte code for the class. 当您在Groovy中重写方法时,您实际上并没有在修改该类的Java字节码。 Your method gets added to a
metaClass
registry. 您的方法将添加到
metaClass
注册表中。 The method calls on the object are intercepted and the metaClass
is checked. 对象上的方法调用将被拦截并检查
metaClass
。
When a Groovy object is passed to Java code it will lose all of its Grooviness and become a POJO
because method interception and metaClass
checking will not happen there. 当Groovy对象传递给Java代码时,它将失去所有的Grooviness并成为
POJO
因为在那里不会发生方法拦截和metaClass
检查。 See this post . 看到这篇文章 。
println
internally uses System.out.println
which bypasses the Groovy method interception and invokes Object.toString()
. println
内部使用System.out.println
,它绕过Groovy方法拦截并调用Object.toString()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.