2013-05-28 21 views
10

スカラーリフレクションを使用して、モデルクラスで定義された特性に関する情報を取得します。メソッドが定義されているかどうかのテスト

ru.runtimeMirror(myClassLoader).staticClass("model.Model").typeSignature.members 

が、これらのメンバーが定義されていないか、彼らは実装を持っているか、いない場合、すなわちされているかどうかを知る方法: は、私は簡単にこのクラスのメンバーはこれをやって入手できますか?

答えて

8

これは見落としです!私はSymbol.isAbstractを追加する2.11.0(https://github.com/scala/scala/pull/2612)をターゲットとするプルリクエストを提出しました。

これは一方では、以下の回避策を使用してくださいので、それは、2.10.xにそれを作ることができないため、互換性の制約のために、新しいAPIであるので:

00:01 ~/Projects/210x (2.10.x)$ scala 
Welcome to Scala version 2.10.3-20130527-133534-9b310bc906 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_45). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> trait C { def foo: Int; def bar = 2 } 
defined trait C 

scala> val foo = typeOf[C].declarations.toList.apply(1) 
foo: reflect.runtime.universe.Symbol = method foo 

scala> val bar = typeOf[C].declarations.toList.apply(2) 
bar: reflect.runtime.universe.Symbol = method bar 

scala> def isDeferred(sym: Symbol) = sym 
     .asInstanceOf[scala.reflect.internal.Symbols#Symbol] 
     .hasFlag(scala.reflect.internal.Flags.DEFERRED) 
isDeferred: (sym: reflect.runtime.universe.Symbol)Boolean 

scala> isDeferred(foo) 
res2: Boolean = true 

scala> isDeferred(bar) 
res3: Boolean = false 
+0

を私がやったします。https://issues.scala -lang.org/browse/SI-7533 – Mathieu

+1

答えを修正して更新しました。 –

関連する問題