如何在自定义类加载器中处理类 [B

发布于 2024-12-25 22:36:08 字数 553 浏览 2 评论 0原文

我想通过 Scala RemoteActor API 发送类数据。我制作了一个自定义类加载器,但加载类[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
}   

I want to send class data through the Scala RemoteActor API. I made a custom ClassLoader but it has trouble loading the class [B. I have found out that it represents byte[] in Java. How could I handle this problem? Here is the loadClass method of my 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
}   

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独夜无伴 2025-01-01 22:36:08

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

The java class byte[] is synonymous with Array[Byte] so if you encounter a class named "[B" then one could simply get the class directly classOf[Array[Byte]] since is a primitive of the language.

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

Unfortunately, things are more complicated than that. There are more java array primitives that need to be handled as well. See how the following classes are named.

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

Notice the type erasure on the last one. And also nested arrays need to be handled as well.

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;"
潜移默化 2025-01-01 22:36:08

数组类必须使用 Class.forName 加载:

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

Array classes must be loaded with Class.forName:

if (name(0) == '[') Class.forName(name, true, classLoader)
else classLoader.loadClass(name)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文