我想在运行时以编程方式确定 Scala 类的所有属性。例如,对于以下 Scala 类,我想确定方法name1
、name3
、name4
和name5
是 的属性的获取器A
:
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
似乎没有返回静态常量。如果您向该类添加另一个方法,则 的info
值name6
将发生变化,同时似乎有一些稳定性:
name3
,name4
, 并且name5
始终具有相同的info
值name6
并且name5
总是有不同的info
价值观
有人知道它的含义info
以及如何使用它来确定它是哪种方法吗?
相关问题: