scala – 测试是否定义了一种方法

我使用 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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...