Как Groovy переводит из char[] в String в GString?
Я пытаюсь выяснить, как Groovy переводит char[]
к String
в пределах GString
,
Пример:
char[] pchar = ['p', 'a', 's', 's']
println "$pchar"
Результат:
проходить
Сначала я предполагал, что он будет использовать метод toString() для char[] (http://groovy.codehaus.org/groovy-jdk/primitive-types/char[].html#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 выполняет это преобразование?
2 ответа
Просматривая источник, может показаться, что соответствующая строка находится в источнике. При создании экземпляра GString он создает объект [] со значениями, которые вы можете увидеть, если получите свойство values на GString:
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);
}
char[] pchar = ['p', 'a', 's', 's']
assert pchar.join() == 'pass'
println "${pchar.join()}"