Scala:打印给定类的字段和值

wiz*_*zle 2 reflection scala traits

因此,我写了一个Debug特质,旨在打印存储在类中的字段和值。

class Point(xv: Int, yv: Int) extends Debug {
var x: Int = xv
var y: Int = yv
var a: String = "test"
}

trait Debug{
    def debugVars():Any = {
        var i = 0
        val vars = this.getClass.getDeclaredFields

        for(v <- vars){
        v.setAccessible(true)
        println("Field: " + vars(i).getName() + " => " + vars(i).get())
        i+=1
        }
    }
}

var p : Point = new Point(3,4)
p.debugVars()
Run Code Online (Sandbox Code Playgroud)

输出应为:

Field: x => 3
Field: y => 4
Field: a => test
Run Code Online (Sandbox Code Playgroud)

但是编译器(我正在使用Eclipse Luna)抛出以下错误:

java.lang.IllegalArgumentException: Can not set int field Point.x to scala.runtime.BoxedUnit
  at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
  at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
  at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
  at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(Unknown Source)
  at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(Unknown Source)
  at java.lang.reflect.Field.get(Unknown Source)
  at Debug$$anonfun$debugVars$1.apply(<console>:21)
  at Debug$$anonfun$debugVars$1.apply(<console>:19)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
  at Debug$class.debugVars(<console>:19)
  at Point.debugVars(<console>:8)
  ... 53 elided
Run Code Online (Sandbox Code Playgroud)

我的问题在for循环中+vars(i).get(),但是我不知道如何修复它。任何解决方案或提示?

Tec*_*mag 5

从“ vars是邪恶的……”的土地上来:)

for你手中的每个"v"在银镀覆-无需使用i作为索引。

trait Debug{
    def debugVars():Any = {
        val vars = this.getClass.getDeclaredFields
        for(v <- vars){
        v.setAccessible(true)
        println("Field: " + v.getName() + " => " + v.get(this))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


moh*_*hit 4

从 Java文档来看, get 需要执行操作的对象。只要改变一下就可以vars(i).get()vars(i).get(this)

进行更改后,您将在 scala 工作表中得到响应,如下所示


object s {
  var p: Point = new Point(3, 4)                  //> p  : dao.Point = dao.Point@7abdd25
  p.debugVars()                                   //> Field: x => 3
                                                  //| Field: y => 4
                                                  //| res0: Any = ()
}
Run Code Online (Sandbox Code Playgroud)