如何在自定义ClassLoader中处理类[B

时间:2012-01-09 20:16:56

标签: java scala reflection

我想通过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
}   

2 个答案:

答案 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)