Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java println在Groovy中不使用重写的toString方法_Java_Groovy - Fatal编程技术网

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()