如何在Scala的Class [_]实例中添加SerialVersionUID? [英] How to add a SerialVersionUID to a Class[_] instance in Scala?

查看:257
本文介绍了如何在Scala的Class [_]实例中添加SerialVersionUID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要创建一个 java.lang.Class 的实例,该实例与 classOf [MyClass] ,但是还有一个 SerialVersionUID ,而 MyClass 没有。 MyClass 是Scala-2.10类。一个问题是,在Java SerialVersionUID 中是静态最终版本,而在Scala中, SerialVersionUID ,因为Scala没有静态变量。

I need to create an instances an instance of java.lang.Class that is otherwise identical to classOf[MyClass] but also has a SerialVersionUID, which MyClass does not have. MyClass is a Scala-2.10 class. One problem is that in Java SerialVersionUID is a static final while in Scala SerialVersionUID since Scala does not have statics.

如果 MyClass 是Java类,我想我会能够使用Javassist做到这一点:

If MyClass was a Java class I think I would be able do this using 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中使用它进行反序列化。
在反序列化期间没有编译或运行时错误,但是反序列化的对象不完整,因此必须存在一些更细微的问题。血腥细节在此处中进行了描述。大概是由于Scala如何处理 static final 字段以及Javassist只理解
Java的事实造成的。我该怎么做,所以对于使用Javassist或任何其他方式的Scala类,它都是100%正确。

However, this does not quiet work for Scala classes. I tried to use this in a ClassLoader for de-serialization. there were no compile or run time errors during deserialization, but the deserialized object is incomplete, so there must be some more subtle problem. The gory details are described here. Presumably the problem comes from how static final fields are dealt with in Scala and the fact that Javassist only understands Java. How can I do it so it is 100% correct for Scala classes using either Javassist or any other means.

推荐答案

如果我编译以下类:

@SerialVersionUID(1L)
object MyClass {
}

$ scalac MyCLass.scala

$ scalac MyCLass.scala

$ javap -cp MyClass $

$ 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。

I'm not familiar with javaassist, but this shows where you need to put the additional field, FWIW.

这篇关于如何在Scala的Class [_]实例中添加SerialVersionUID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆