4

我需要创建一个实例,该实例在java.lang.Class其他方面与它相同,classOf[MyClass]但也有一个SerialVersionUID,它MyClass没有。MyClass是一个 Scala-2.10 类。一个问题是,在 JavaSerialVersionUID中使用 Scala 有一段static final时间,SerialVersionUID因为 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 中使用它进行反序列化。反序列化过程中没有编译或运行时错误,但是反序列化的对象是不完整的,所以肯定有一些更微妙的问题。这里描述了血腥的细节。大概问题出static final在 Scala 中如何处理字段以及 Javassist 只理解 Java 的事实。我该怎么做才能使使用 Javassist 或任何其他方式的 Scala 类 100% 正确。

4

1 回答 1

2

如果我编译以下类:

@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 的位置。

于 2014-04-22T00:28:17.507 回答