Groovy如何从一个GString中的char []转换为String?

FGr*_*reg 2 groovy tostring gstring

我试图找出Groovy如何将a char[]转换为Stringa GString.

例:

char[] pchar = ['p', 'a', 's', 's']
println "$pchar"
Run Code Online (Sandbox Code Playgroud)

结果:

通过

起初我假设它会在char [](http://groovy.codehaus.org/groovy-jdk/primitive-types/char [] .html#toString())上使用toString()方法.但运行以下代码的结果似乎暗示:

char[] pchar = ['p', 'a', 's', 's']
println "$pchar"

pchar.class.metaClass.toString = {->
    "****"
}

println pchar.toString()
println "$pchar"
Run Code Online (Sandbox Code Playgroud)

结果:

通过

****

通过

我也试过压倒invokeMethod()试图搞清楚无济于事:

char[] pchar = ['p', 'a', 's', 's']
println "$pchar"

pchar.class.metaClass.toString = {->
    "****"
}
pchar.class.metaClass.invokeMethod = {String methodName, Object arguments ->
    println("Method called on ${delegate.class}: $methodName, $arguments")
    def metaMethod = delegate.metaClass.getMetaMethod(methodName)
    return metaMethod.invoke(delegate, arguments)
}

println pchar.toString()
println "$pchar"
Run Code Online (Sandbox Code Playgroud)

结果:

通过

在类[C:toString,[]上调用的方法

****

通过

有谁知道Groovy如何进行这种转变?

Phu*_*ong 9

浏览源,看起来相关的行在源中.实例化GString时,它会创建一个Object []值,如果在GString上获得values属性,则可以看到这些值:

char[] pchar = ['p', 'a', 's', 's']
pchar.values // [pass]
Run Code Online (Sandbox Code Playgroud)

在GString源代码中,它最终将对象值(char [])传递给InvokerHelper write()方法,该方法将值传递给toString(object).在toString()方法中,您会发现它与条件不匹配,最后将它传递给format()方法,在该方法中,它在源代码行中检查参数是否为char数组,然后创建一个新的char数组中的字符串.

    if (arguments.getClass().isArray()) {
        if (arguments instanceof char[]) {
            return new String((char[]) arguments);
        }
        return format(DefaultTypeTransformation.asCollection(arguments), verbose, maxSize);
    }
Run Code Online (Sandbox Code Playgroud)