我需要创建一个
java.lang.Class实例的实例,该实例与classOf [MyClass]相同,但也有一个MyVlass没有的SerialVersionUID. MyClass是一个
Scala-2.10类.一个问题是,在
Java中,SerialSersionUID是Scala SerialVersionUID中的静态final,因为Scala没有静态.
如果MyClass是一个Java类,我想我可以使用Javassist来做到这一点:
val ctclass = javassist.ClassPool.getDefault().get("mypackagage.MyClass")
val field = javassist.CtField.make(
"private static final long serialVersionUID = 1L;",
ctclass)
ctclass.addField(field)
val cls = ctclass.toClass()
但是,这对Scala类来说并不安静.我试图在ClassLoader中使用它来进行反序列化.
反序列化期间没有编译或运行时错误,但反序列化的对象不完整,因此必须有一些更微妙的问题.详细描述了血腥细节here.据推测,问题来自于Scala如何处理静态最终字段以及Javassist只能理解的事实
Java的.我怎么能这样做,因此使用Javassist或任何其他方法对Scala类100%正确.
最佳答案 如果我编译以下类:
@SerialVersionUID(1L)
object MyClass {
}
$scalac MyCLass.scala
$javap -cp MyClass $
Compiled from "MyClass.scala"
public final class MyClass${
public static final MyClass$MODULE$;
public static final long serialVersionUID;
public static {};
}
我不熟悉javaassist,但这显示了你需要放置附加字段FWIW的位置.