我想以編程方式確定運行時的Scala類的所有屬性。例如,對於下面的Scala類,我想確定方法name1
,name3
,name4
和name5
是干將爲A
性質:如何在運行時確定一個Scala類的屬性?
class A(val name1: String, private val name2: String) {
val name3 = ""
var name4 = ""
def name5 = ""
def name6() = ""
}
大部分的工作可以用Java的反射API來完成。不幸的是,我無法檢測到name5
和name6()
之間的差異。因此,我開始使用ScalaSigParser進行下一次試用,但不幸的是,ScalaSig的name5
和name6()
的標誌也是相同的。這裏是我的代碼:
def gettersOf(clazz: Class[_]) = {
for (ssig <- ScalaSigParser.parse(clazz))
yield {
ssig.symbols.toList.collect{
case m: MethodSymbol => m
}.filter(m => (m.symbolInfo.flags & 0xFFFFF) == 0x200)
}
}
gettersOf(classOf[A]).get.foreach{m =>
println(m.name + ": " + m)
}
正如你可以在下面的輸出這兩種方法的區別僅在於info
值看:
name1: MethodSymbol(name1, owner=0, flags=28400200, info=22 ,None)
<init>: MethodSymbol(<init>, owner=0, flags=200, info=38 ,None)
name3: MethodSymbol(name3, owner=0, flags=8400200, info=45 ,None)
name4: MethodSymbol(name4, owner=0, flags=8000200, info=45 ,None)
name4_$eq: MethodSymbol(name4_$eq, owner=0, flags=8000200, info=54 ,None)
name5: MethodSymbol(name5, owner=0, flags=200, info=45 ,None)
name6: MethodSymbol(name6, owner=0, flags=200, info=66 ,None)
然而,info
似乎並不返回靜態常量。如果添加另一種方法類的name6
的info
值就會產生變化,而似乎有一定的穩定性:
name3
,name4
和name5
始終相同info
值name6
和name5
始終不同info
values
是否有人知道info
的含義以及如何使用它來確定它的確切類型?
相關問題:
不是直接回答,但你知道,斯卡拉2。10即將到來,並有新的反思api?你可能會爲此嘗試一個里程碑。 – 2012-08-13 12:57:50
@BrianSmith:謝謝你的提示。我實際上想立即跳到Scala 2.10。不幸的是,我的大部分依賴關係還不能用於2.10。 – 2012-08-13 13:08:20