如何在 Scala 中将 SerialVersionUID 添加到 Class[_] 实例?

2024-04-05

我需要创建一个实例java.lang.Class在其他方面与classOf[MyClass]但也有一个SerialVersionUID, which MyClass不具有。MyClass是一个 Scala-2.10 类。一个问题是在Java中SerialVersionUID is a static final在斯卡拉时SerialVersionUID因为 Scala 没有静态。

If 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 类来说并不安静。我尝试在类加载器中使用它来进行反序列化。 反序列化期间没有编译或运行时错误,但反序列化的对象不完整,因此肯定存在一些更微妙的问题。描述了血淋淋的细节here https://stackoverflow.com/questions/17246409/deserialization-throws-classnotfoundexception-javaconversionsseqwrapper-in-s/17384647#17384647。想必问题出在如何static final字段是在 Scala 中处理的,而 Javassist 只能理解这一事实 爪哇。我怎样才能做到这一点,以便使用 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 的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala 中将 SerialVersionUID 添加到 Class[_] 实例? 的相关文章

随机推荐