2012-02-08 9 views
2

私はchar[]Stringに変換する方法をGroovyがGStringに変換する方法を見つけようとしています。GroovyはGString内のchar []をStringにどのように変換しますか?

例:

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

結果:私はそれがchar []に、toString()メソッドを使用すると仮定まず

パス(HTTP://groovy.codehaus .org/groovy-jdk /プリミティブ型/ 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がこの変換をどのように行うのか誰にでも分かりますか?

答えて

9

ソースを参照すると、関連するline is in the sourceが表示されます。 ] Gストリングのソースで

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

、それは最終的にはオブジェクト値(文字を[渡し:Gストリングをインスタンス化する場合、それはあなたがGストリング上の値のプロパティを取得するかどうかを確認することができます[]値のオブジェクトを作成し、 )をInvokerHelperのwrite()メソッドに渡します。このメソッドは、その値をtoString(オブジェクト)に渡します。 toString()メソッドでは、条件に一致しないことがわかり、最終的にはformat()メソッドに渡します。ソースの行で、引数がcharの配列であるかどうかをチェックし、 char配列の文字列

if (arguments.getClass().isArray()) { 
     if (arguments instanceof char[]) { 
      return new String((char[]) arguments); 
     } 
     return format(DefaultTypeTransformation.asCollection(arguments), verbose, maxSize); 
    }