我想你可以從java.lang.Class
得到Type
。看下面的例子。
╰─$ scala
Welcome to Scala version 2.11.2 (OpenJDK 64-Bit Server VM, Java 1.7.0_65).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.reflect._
import scala.reflect.runtime.universe._
trait Component {
def parent: Int = 0
}
class MyComponent extends Component {
def child: Int = 0
}
def printRuntimeMemberNames(component: Component) = {
val cls = component.getClass
val mirror = runtimeMirror(cls.getClassLoader)
val symbol = mirror.staticClass(cls.getName)
val tpe = symbol.toType
val members = tpe.members
val memberNames = members.map(_.name.decodedName.toString)
println(memberNames.mkString(", "))
}
// Exiting paste mode, now interpreting.
import scala.reflect._
import scala.reflect.runtime.universe._
defined trait Component
defined class MyComponent
printRuntimeMemberNames: (component: Component)Unit
scala> val c: Component = new MyComponent
c: Component = [email protected]
scala> printRuntimeMemberNames(c)
<init>, child, parent, $init$, $asInstanceOf, $isInstanceOf, synchronized, ##, !=, ==, ne, eq, notifyAll, notify, clone, getClass, hashCode, toString, equals, wait, wait, wait, finalize, asInstanceOf, isInstanceOf