在Groovy对象中打印出变量和值

时间:2010-06-18 12:49:23

标签: reflection groovy

如何打印出(公共和内部)变量及其Groovy对象的值?

class X
{
  def X = 10
  def Y = 5

  private void doPrivate()
  {
      def Z = 3
  }
}

应该给予

X, 10
Y, 5
Z, 3

这必须是一个动态的解决方案,即在运行时。

3 个答案:

答案 0 :(得分:73)

dump()

例如

"ddd".dump()

打印:

  

java.lang.String@2ef900 value = dddd offset = 0 count = 4 hash = 3078400

答案 1 :(得分:37)

你的意思是这样吗?

def a = "Hi"

a.properties.each { println "$it.key -> $it.value" }

给出:

class -> class java.lang.String
bytes -> [72, 105]
empty -> false

[编辑]

根据您编辑的问题,这会给您:

class -> class X
y -> 5
metaClass -> org.codehaus.groovy.runtime.HandleMetaClass@16de4e1[groovy.lang.MetaClassImpl@16de4e1[class X]]
x -> 10

我不认为在运行时获取Z值是可能的......我能想到的唯一方法是通过AST ...

答案 2 :(得分:0)

具有一个可以调用对象本身的函数很方便,但并不存在。如果您不介意污染Object的metaClass上的名称空间,则可以使用以下方式猴子对其进行修补:

Object.metaClass.printit { -> println org.codehaus.groovy.runtime.InvokerHelper.toString(delegate) }
'asdf'.printit() // prints 'asdf'

printit不是最大的名字,但是printprintlndump都被采用。