Groovy: Metaprogrammierung

Expando: | Ein Expando-Objekt hat keinen festgelegten Zustand, sondern wir können ihm dynamisch einen geben.

Expando expando = new Expando()
expando.name = "Testname"
expando.streetname = "Teststreet 1a"

println expando.properties

([name:Testname, streetname:Teststreet 1a])

MetaClass:

Integer.metaClass.add = {delegate=delegate+it}
println 3.add(5)

(8)

Integer.metaClass.add = {delegate=delegate-it}
println 3.add(5)

(-2)

Hier ein Beispiel für eine neue Operator-Methode, welche eine beliebige Anzahl an Argumenten addiert. Dazu besitzt die Closure ein Argument vom Typ VarArg.

Integer.metaClass.addVarArg = {... args ->
def total = 0
args.each {
total += it
}
delegate + total
}
println 1.addVarArg(2,3,4,5,6,7,8)

(36)

grep:

Integer.metaClass.grep = {list -> "${[1,2,3,4,5,6,7,8,9].grep(delegate)}"}
println 4.grep([1,2,3,4,5,6,7,8,9])

([4])

Integer.metaClass.grep = {list -> "${[1,2,3,4,5,6,7,8,9].grep(delegate)}"}
println 10.grep([1,2,3,4,5,6,7,8,9])

([])

toString():

Neue toString() - Methode für List-Objekte, welche zusätzlich zum Wert auch den Index mit ausgibt:

List.metaClass.toString2 = {
def result = "["
delegate.eachWithIndex {value,index ->
result += index
result += ":"
result += value
result += ", "
}
if(delegate.size > 0) {
result = result.trim()
result = result.substring(0, result.length() - 1)
}
result += "]"
}
println [1,2,3,4,5,6,7,8,9].toString2()

([0:1, 1:2, 2:3, 3:4, 4:5, 5:6, 6:7, 7:8, 8:9])