10
我使用scala反射來獲取我的模型類中定義的特徵的信息。 我可以很容易地得到這個類的成員這樣做:測試是否定義方法
ru.runtimeMirror(myClassLoader).staticClass("model.Model").typeSignature.members
但如何知道這些成員是否被定義或沒有,也就是說,如果他們有一個執行或不?
我使用scala反射來獲取我的模型類中定義的特徵的信息。 我可以很容易地得到這個類的成員這樣做:測試是否定義方法
ru.runtimeMirror(myClassLoader).staticClass("model.Model").typeSignature.members
但如何知道這些成員是否被定義或沒有,也就是說,如果他們有一個執行或不?
哇,這是一個疏忽!我已提交目標爲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
我所做的:HTTPS://issues.scala -lang.org/browse/SI-7533 – Mathieu
修復並更新了答案 –