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如何进行这种转变?
浏览源,看起来相关的行在源中.实例化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)