Как 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()}"
Другие вопросы по тегам