2013-03-19 50 views
1

我正在使用scalap來挑選關於Scala類的信息。適用於案例類,但我想查看一個類是否爲值類。到目前爲止,我還沒有發現任何可以告訴我的事情。任何人都知道如何區分價值類和非價值類嗎?價值類的scalap檢測

+0

順便說一下:https://groups.google.com/forum/?fromgroups=#!topic/scala-internals/wAR-E9HQLmA(不,它不是scalap解決方案,但可能會幫助某個會找到這個的人線)。 – 2013-03-19 20:59:27

回答

4
$ 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 */ } 
} 

第一行給它拿走,NO 3:最後一類ValueClass擴展scala.AnyVal

編輯:如果你不使用scalap並且要在運行時做到這一點,你可以(非常hackishly)

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

至少現在。也許將來會有一個更易於抓取的isValueClass標誌。

+0

我明白你在說什麼,但我在實踐中遇到了問題。如果我爲我的類獲取一個Class對象,我可以調用clazz.getSuperclass我得到對象,而不是AnyVal。我也試過clazz.isInstanceOf [AnyVal],編譯器沒有它。所以我很難搞清楚如何測試AnyVal親子關係。有任何想法嗎? – Greg 2013-03-20 18:54:55

+1

這不完全是「使用scalap」,是嗎? – 2013-03-20 19:15:04