Scala:打印字段和给定值 class
Scala: Printing fields and values of given class
所以我写了一个 Debug trait,用于打印存储在 class.
中的字段和值
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()
输出应该是:
Field: x => 3
Field: y => 4
Field: a => test
但是编译器(我使用的是 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.apply(<console>:21)
at Debug$anonfun$debugVars.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
我的问题出在 for 循环 +vars(i).get()
,但我不知道如何修复它。任何解决方案或提示?
从Javadocs开始,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 = ()
}
</pre>
来自 "vars are evil..." 的土地:)
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))
}
}
}
所以我写了一个 Debug trait,用于打印存储在 class.
中的字段和值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()
输出应该是:
Field: x => 3
Field: y => 4
Field: a => test
但是编译器(我使用的是 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.apply(<console>:21)
at Debug$anonfun$debugVars.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
我的问题出在 for 循环 +vars(i).get()
,但我不知道如何修复它。任何解决方案或提示?
从Javadocs开始,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 = ()
}
</pre>
来自 "vars are evil..." 的土地:)
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))
}
}
}