2012-01-09 25 views
2

我想通過Scala RemoteActor API發送類數據。我製作了一個自定義ClassLoader,但它在加載類[B時遇到問題。我發現它代表了Java中的byte[]。我怎麼能處理這個問題?這是我的ClassLoader的loadClass方法。所以,如果你遇到了一個名爲"[B"類,那麼一個可以簡單地獲取類直接classOf[Array[Byte]],因爲是一種原始的語言如何處理類[B在自定義ClassLoader中

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'一類 - 相當於.class文件管道到遠程JVM - 或者是你只是試圖發送一個表示兩個系統已知的類的'Class'對象? – 2012-01-09 20:23:19

+0

我正在發送一個'Array [Byte]'來定義這個類。我想這是第一個。 – laci37 2012-01-09 20:33:50

回答

1

Java類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;" 

注意最後一個類型的擦除。而且嵌套數組也需要處理。

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 [Array [Byte]]]?我怎麼能實現呢?我無法使用實例java.lang.Class [_]作爲類型。 – laci37 2012-01-10 12:16:29

+0

java.lang.reflect.Array.newInstance(inner,0).getClass()似乎適用於創建類內部的數組 – laci37 2012-01-10 13:06:38

+0

它現在很好用。感謝您的幫助。 – laci37 2012-01-10 17:16:20

1

數組類必須裝載Class.forName

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

這沒有奏效。 :( – laci37 2012-01-10 17:16:29