Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在自定义类加载器中处理类[B]_Java_Scala_Reflection - Fatal编程技术网

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

Java 如何在自定义类加载器中处理类[B],java,scala,reflection,Java,Scala,Reflection,我想通过Scala RemoteActor API发送类数据。我制作了一个自定义类加载器,但它在加载类[B时遇到问题。我发现它在Java中表示字节[]。我如何处理这个问题?下面是我的类加载器的loadClass方法 override def loadClass(name: String): Class[_] = { if(ClientEntry.verbose) println("loadClass "+name) var c = findLoadedClass(name) if (c ==

我想通过Scala RemoteActor API发送类数据。我制作了一个自定义类加载器,但它在加载类
[B
时遇到问题。我发现它在Java中表示
字节[]
。我如何处理这个问题?下面是我的类加载器的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
}   

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

数组类必须与
类一起加载。forName

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

您是否试图通过
RemoteActor
加载一个类-相当于将.class文件管道传输到远程JVM-或者您只是试图发送一个表示两个系统都知道的类的
class
对象?我正在发送一个
数组[字节]
来定义类。我想这是第一个。这解释了很多。因此,如果代码请求类[[B例如,我应该返回[Array[Array[Byte]]]的类吗?我该如何实现它?我在使用实例java.lang.class[\u]作为types.java.lang.reflect.Array.newInstance(inner,0.getClass()时遇到问题似乎可以用于创建类内部的数组