実行時に 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値を持つname6name5常に異なるinfo値を持っている
誰かがその意味とinfo、それを使用してどのような方法であるかを確実に判断する方法を知っていますか?
関連する質問: