我试图弄清楚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如何进行这种转换?
答案 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);
}