Java 如何在自定义类加载器中处理类[B]
我想通过Scala RemoteActor API发送类数据。我制作了一个自定义类加载器,但它在加载类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 ==
[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()时遇到问题似乎可以用于创建类内部的数组