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

时间:2012-02-08 20:27:32

标签: groovy tostring gstring

我试图弄清楚Groovy如何将char[]转换为String内的GString

示例:

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

结果:

通过

起初我假设它会在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"

结果:

通过

****

通过

我还尝试覆盖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"

结果:

通过

在类[C:toString,[]

上调用的方法

****

通过

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

1 个答案:

答案 0 :(得分:9)

浏览源代码时,会出现相关的line is in the source。实例化GString时,它会创建一个Object []值,如果在GString上获得values属性,则可以看到这些值:

char[] pchar = ['p', 'a', 's', 's']
pchar.values // [pass]

在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);
    }