web-dev-qa-db-fra.com

Imprimer des variables et des valeurs dans un objet Groovy

Comment puis-je imprimer les variables (publiques et internes) et leurs valeurs d'objet Groovy?

C'est à dire

class X
{
  def X = 10
  def Y = 5

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

Devrait donner

X, 10
Y, 5
Z, 3

Cela doit être une solution dynamique, c'est-à-dire au moment de l'exécution.

28
geejay

Tu veux dire comme cela?

def a = "Hi"

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

Donne:

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

[modifier]

Avec votre question modifiée, cela vous donnerait:

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

Je ne pense pas qu'il soit possible d'obtenir la valeur Z au moment de l'exécution ... La seule façon de le faire est de le faire via l'AST ...

32
tim_yates

Avoir une fonction que vous pouvez appeler sur un objet lui-même est pratique mais n’existe pas immédiatement. Si cela ne vous dérange pas de polluer l’espace de nommage sur la métaClass de Object, vous pouvez le patcher avec un correctif semblable à ceci:

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

printit n'est pas le plus grand nom, mais print, println et dump sont tous pris.

0
Marty Neal