gpt4 book ai didi

java - println 不在 Groovy 中使用覆盖的 toString 方法

转载 作者:行者123 更新时间:2023-11-30 07:08:20 25 4
gpt4 key购买 nike

我已经为我的对象覆盖了 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 字节码。您的方法被添加到 metaClass 注册表中。拦截对对象的方法调用并检查 metaClass

当一个 Groovy 对象被传递给 Java 代码时,它将失去所有的 Groovy 并变成一个 POJO,因为那里不会发生方法拦截和 metaClass 检查。看到这个 post

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

关于java - println 不在 Groovy 中使用覆盖的 toString 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24052793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com