[[SCALAの記事一覧]] &topicpath; *目次 [#c52c9250] *ScalaSigParser [#s2fe513f] 2010/01/23現在では、scalaの安定バージョンは2.7.7だが、バージョン2.8がNight Buildからダウンロードできるようになっており、ScalaSigParserが使えるようになっている。 具体的にはscalaのバージョン2.8をいれると下記に示すURLのサンプルコードのimport文でエラーがでなくなる。 参考URL http://stackoverflow.com/questions/1833762/scala-reflection-getdeclaringtrait 変更内容 http://www.scala-lang.org/node/4587 *ScalaSigParserインポート [#lc55d886] import tools.scalap.scalax.rules.scalasig._ import scala.runtime._ *例:RichDouble クラスの情報をパースしてみる。 [#h7ad17a9] val scalaSig = ScalaSigParser.parse(classOf[RichDouble]).get **結果 [#x7f7a75a] scalaSig にクラス情報が格納される。 実行結果の結果表示がたくさんあるため、14行程度で出力が打ち止めになっている。 scalaSig: scala.tools.scalap.scalax.rules.scalasig.ScalaSig = ScalaSig version 5.0 0: ClassSymbol(RichDouble, owner=scala.runtime, flags=40000002, info=7 ,Non e) 1: RichDouble 2: scala.runtime 3: runtime 4: scala 5: scala 6: NoSymbol 7: ClassInfoType(ClassSymbol(RichDouble, owner=scala.runtime, flags=4000000 2, info=7 ,None),List(TypeRefType(ThisType(java.lang),java.lang.Object,List()), TypeRefType(ThisType(scala),scala.Proxy,List()), TypeRefType(SingleType(SingleTy pe(ThisType(<nosymbol>.<root>),scala),scala.package),scala.package.Ordered,List (TypeRefType(ThisType(scala),scala.Double,List()))), TypeRefType(ThisType(scala) ,scala.ScalaObject,List()))) 8: TypeRefType(ThisType(java.lang),java.lang.Object,List()) 9: ThisType(java.lang) 10: java.lang 11: lang 12: java 13: java 14: java.lang.O... *クラス情報のtopLevelClassesの一つ目の情報を取得してみる。 [#pd2e01b3] val richDoubleSymbol = scalaSig.topLevelClasses.head **結果 [#g8ef5134] richDoubleSymbol: scala.tools.scalap.scalax.rules.scalasig.ClassSymbol = ClassSy mbol(RichDouble, owner=scala.runtime, flags=40000002, info=7 ,None) *クラス情報のtopLevelClassesの一つ目の情報のメソッド情報をみてみる [#oe9b23ab] val methods = richDoubleSymbol.children filter ( _ match { case m : MethodSymbol => true case _ => false }) **結果 [#e29e0f28] 結果が改行無しで大量に表示されおり、途中で打ち止めになっている。 methods: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List(MethodSymbo l(x, owner=0, flags=20080004, info=32 ,None), MethodSymbol(<init>, owner=0, flag s=200, info=42 ,None), MethodSymbol(self, owner=0, flags=200, info=48 ,None), Me thodSymbol(compare, owner=0, flags=200, info=54 ,None), MethodSymbol(min, owner= 0, flags=200, info=62 ,None), MethodSymbol(max, owner=0, flags=200, info=66 ,Non e), MethodSymbol(abs, owner=0, flags=200, info=70 ,None), MethodSymbol(round, ow ner=0, flags=200, info=73 ,None), MethodSymbol(ceil, owner=0, flags=200, info=70 ,None), MethodSymbol(floor, owner=0, flags=200, info=70 ,None), MethodSymbol(un til, owner=0, flags=200, info=83 ,None), MethodSymbol(until, owner=0, flags=200, info=102 ,None), MethodSymbol(to, owner=0, flags=200, info=108 ,None), Metho... **結果をみやすくしてみる [#l0eef9a2] methods foreach println MethodSymbol(x, owner=0, flags=20080004, info=32 ,None) MethodSymbol(<init>, owner=0, flags=200, info=42 ,None) MethodSymbol(self, owner=0, flags=200, info=48 ,None) MethodSymbol(compare, owner=0, flags=200, info=54 ,None) MethodSymbol(min, owner=0, flags=200, info=62 ,None) MethodSymbol(max, owner=0, flags=200, info=66 ,None) MethodSymbol(abs, owner=0, flags=200, info=70 ,None) MethodSymbol(round, owner=0, flags=200, info=73 ,None) MethodSymbol(ceil, owner=0, flags=200, info=70 ,None) MethodSymbol(floor, owner=0, flags=200, info=70 ,None) MethodSymbol(until, owner=0, flags=200, info=83 ,None) MethodSymbol(until, owner=0, flags=200, info=102 ,None) MethodSymbol(to, owner=0, flags=200, info=108 ,None) MethodSymbol(to, owner=0, flags=200, info=111 ,None) MethodSymbol(toRadians, owner=0, flags=200, info=70 ,None) MethodSymbol(toDegrees, owner=0, flags=200, info=70 ,None) MethodSymbol(isInfinity, owner=0, flags=200, info=120 ,None) MethodSymbol(isPosInfinity, owner=0, flags=200, info=120 ,None) MethodSymbol(isNegInfinity, owner=0, flags=200, info=120 ,None) どのようなメソッドが実装されているのか一覧を得ることができた。 *Traitなのかどうか調べる [#ube831a9] richDoubleSymbol.isTrait **結果 [#t25fd345] res1: Boolean = false *他のクラスでTraitかどうか調べる方法一行バージョン [#u08114e6] ScalaSigParser.parse(classOf[Ordered[Any]]).get.topLevelClasses.head.isTrait **結果 [#f11a5098] res2: Boolean = true *他参考URL [#d7a2d5da] http://www.scala-lang.org/node/4721 *感想 [#v5bfe546] ScalaSigParserに関する情報はまだ乏しく、こまめに検索などをして情報を集める必要があるかもしれません。