2012-01-09 16 views
2

Scala RemoteActor APIを使用してクラスデータを送信します。カスタムClassLoaderを作成しましたが、クラスのロードに問題があります[B。私はそれがJavaのbyte[]を表すことを知りました。どのように私はこの問題に対処できますか?私のClassLoaderのloadClassメソッドを次に示します。カスタムClassLoaderでクラス[Bを処理する方法

override def loadClass(name: String): Class[_] = { 
if(ClientEntry.verbose) println("loadClass "+name) 
var c = findLoadedClass(name) 

if (c == null) { 
    try { 
    c = findSystemClass(name) 
    } catch { case _ => null} 
} 
if (c == null) { 
    try { 
    c = defaultloader.loadClass(name) 
    } catch { 
    case _ => c = loadRemoteClass(name) 
    } 
} 
    resolveClass(c) 
    c 
} 
+0

あなたはRemoteActor' '通じ*ロード*クラスしようとしている - リモートJVMへの.classファイルを配管に同等 - またはあなたがあります両方のシステムに知られているクラスを表す 'Class'オブジェクトを送信しようとしていますか? –

+0

クラスを定義するために 'Array [Byte]'を送ります。私はそれが最初だと思います。 – laci37

答えて

1

Javaクラスbyte[]はあなたが"[B"というクラスが発生した場合、言語のプリミティブであるため、そうして1は、単に直接classOf[Array[Byte]]クラスを得ることができArray[Byte]と同義です。

if (name == "[B") 
    c = classOf[Array[Byte]] 

残念ながら、状況はそれよりも複雑です。処理される必要のあるJava配列プリミティブがさらにあります。次のクラスの名前の付け方を参照してください。

println(classOf[Array[Boolean]].getName) // "[Z" 
println(classOf[Array[Byte]].getName) // "[B" 
println(classOf[Array[Char]].getName) // "[C" 
println(classOf[Array[Int]].getName) // "[I" 
println(classOf[Array[Long]].getName) // "[J" 
println(classOf[Array[Double]].getName) // "[D" 
println(classOf[Array[Float]].getName) // "[F" 
println(classOf[Array[String]].getName) // "[Ljava.lang.String;" 
println(classOf[Array[Any]].getName) // "[Ljava.lang.Object;" 
println(classOf[Array[Option[Any]]].getName) // "[Lscala.Option;" 

は、最後の1の型消去を注意してください。また、ネストした配列も同様に処理する必要があります。

println(classOf[Array[Array[Boolean]]].getName) // "[[Z" 
println(classOf[Array[Array[Array[Boolean]]]].getName) // "[[[Z" 
println(classOf[Array[Array[Option[_]]]].getName) // "[[Lscala.Option;" 
println(classOf[Array[Array[Array[Option[_]]]]].getName) // "[[[Lscala.Option;" 
+0

それはたくさん説明します。したがって、コードがクラス[[Bの場合、ClassOf [Array [Byte]]]を返す必要がありますか?そして私はそれをどのように実装できますか?私は型としてjava.lang.Class [_]インスタンスを使用するのに問題があります。 – laci37

+0

java.lang.reflect.Array.newInstance(inner、0).getClass()は内部クラスの配列を作成するために働いているようです – laci37

+0

これはうまく動作します。ご協力ありがとうございました。 – laci37

1

配列クラスは、Class.forNameをロードする必要があります。

if (name(0) == '[') Class.forName(name, true, classLoader) 
else classLoader.loadClass(name) 
+0

これは機能しませんでした。 :( – laci37

関連する問題