Как обрабатывать класс [B в пользовательском ClassLoader - PullRequest
2 голосов
/ 10 января 2012

Я хочу отправить данные класса через Scala RemoteActor API. Я сделал собственный ClassLoader, но у него проблемы с загрузкой класса [B. Я обнаружил, что он представляет byte[] в Java. Как я мог справиться с этой проблемой? Вот метод loadClass моего 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
}   

Ответы [ 2 ]

1 голос
/ 10 января 2012

Классы массива должны быть загружены с Class.forName:

if (name(0) == '[') Class.forName(name, true, classLoader)
else classLoader.loadClass(name)
1 голос
/ 10 января 2012

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;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...