我想通过Scala RemoteActor API发送类数据。我制作了一个自定义的ClassLoader但是加载类[B
时遇到了问题。我发现它在Java中代表byte[]
。我怎么能处理这个问题?这是我的ClassLoader的loadClass方法。
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 :(得分:1)
java类byte[]
与Array[Byte]
同义,所以如果你遇到一个名为"[B"
的类,那么可以简单地直接获取类classOf[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;"
答案 1 :(得分:1)
必须使用Class.forName
加载数组类:
if (name(0) == '[') Class.forName(name, true, classLoader)
else classLoader.loadClass(name)