值类的scala检测



我正在使用scalap挑选关于Scala类的信息。对于case类来说很好,但我想看看一个类是否是一个值类。到目前为止,我还没有找到任何能告诉我这一点的证据。有人知道如何区分值类和非值类吗?

$ cat ValueClass.scala
class ValueClass(val s: String) extends AnyVal {
  def rcap = s.reverse.toUpperCase
}
$ scalap -cp . ValueClass
final class ValueClass extends scala.AnyVal {
  val s : scala.Predef.String = { /* compiled code */ }
  def this(s : scala.Predef.String) = { /* compiled code */ }
  def rcap : java.lang.String = { /* compiled code */ }
  override def hashCode() : scala.Int = { /* compiled code */ }
  override def equals(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}
object ValueClass extends scala.AnyRef {
  def this() = { /* compiled code */ }
  final def rcap$extension($this : ValueClass) : java.lang.String = { /* compiled code */ }
  final def hashCode$extension($this : ValueClass)() : scala.Int = { /* compiled code */ }
  final def equals$extension($this : ValueClass)(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}

第一行就暴露了,不是吗?:最终类ValueClass扩展了scala。AnyVal

编辑:如果你不使用scalap,你想在运行时做,你可以(非常hack)

class V(val v: Int) extends AnyVal {}
reflect.runtime.universe.typeOf[V].typeSymbol.companionSymbol.
  typeSignature.members.exists(_.name.toString.endsWith("$extension"))

至少现在是这样。也许将来会有一个更容易抓取的isValueClass标志。

相关内容

  • 没有找到相关文章

最新更新