Scala反射在运行时访问所有公共字段

use*_*074 10 scala

给定以下类层次结构:

class A {
  val x = 3
  val y = 4
}

class B extends A {
  val x = 4
}
Run Code Online (Sandbox Code Playgroud)

并说我有一个B实例,没有编译时的类层次结构知识,并希望能够报告如下内容:

Class: B
val[x]: 3
val[y]: 4
val[z]: 5
Run Code Online (Sandbox Code Playgroud)

使用scala反射的最佳方法是什么?

谢谢Des

J C*_*ell 14

简单来说:

import scala.reflect.runtime.universe._

val a = new A
val rm = scala.reflect.runtime.currentMirror
val accessors = rm.classSymbol(a.getClass).toType.members.collect {
  case m: MethodSymbol if m.isGetter && m.isPublic => m 
}
val instanceMirror = rm.reflect(a)
for(acc <- accessors)
  println(s"$a: ${instanceMirror.reflectMethod(acc).apply()}")
Run Code Online (Sandbox Code Playgroud)