2012-02-08 8 views
2

Я пытаюсь понять, как Groovy переводит char[] в String в пределах GString.Как Groovy переводит из char [] в String внутри GString?

Пример:

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

Результат:

проход

Сначала я предположил, что это было бы использовать метод ToString() на полукокса [] (HTTP: //groovy.codehaus .org/заводной-JDK/примитивные типы-/ символ []. HTML # ToString()). Но результаты выполнения следующего кода, кажется, свидетельствуют об обратном:

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

pchar.class.metaClass.toString = {-> 
    "****" 
} 

println pchar.toString() 
println "$pchar" 

Результат:

проход

****

проход

Я ve также попробовал переопределить 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 делает это преобразование?

ответ

9

Просмотрев исходный код, выяснилось бы, что соответствующий line is in the source. При вызове в GSTRING, он создает объект [] значений, которые вы можете увидеть, если вы получите значение свойств на GSTRING:

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

В источнике GSTRING, он в конечном итоге передает значение объекта (полукокс []) к методу write() InvokerHelper, который передает значение 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); 
    }