Проверьте, определен ли метод

Я использую отражение scala для получения информации о признаке, определенном в моем классе модели. Я легко могу получить членов этого класса:

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

но как узнать, определены ли эти члены или нет, т.е. если они имеют реализацию или нет?

Ответ 1

Ничего себе, что надзор! Я отправил запрос на растяжение, нацеленный на 2.11.0 (https://github.com/scala/scala/pull/2612), который добавляет Symbol.isAbstract.

Поскольку это новый API, из-за ограничений совместимости он не может превратить его в 2.10.x, поэтому в то же время используйте следующее обходное решение:

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