実行時に 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
、それを使用してどのような方法であるかを確実に判断する方法を知っていますか?
関連する質問: