meta-programming in groovy - · pdf filemeta-programming in groovy 3 groovy is an agile...

25
29.02.2008 Meta-programming in Groovy Lars Blumberg Christoph Hartmann Arvid Heise

Upload: dinhmien

Post on 21-Feb-2018

271 views

Category:

Documents


1 download

TRANSCRIPT

29.02.2008

Meta-programming in Groovy

Lars Blumberg

Christoph Hartmann

Arvid Heise

2Meta-programming in Groovy

James Strachan wrote

The Groovy Story

3Meta-programming in Groovy

“Groovy is an agile dynamic language for the Java Platform with many features that are inspired by

languages like Python, Ruby and Smalltalk, making them available to Java developers using a

Java-like syntax.”

The Groovy web site

4Meta-programming in Groovy

My class is your class

Groovy

Java

Java Runtime Environment

Adopted from Gina, p. 5

5Meta-programming in Groovy

Precompiled vs. direct mode

Adopted from Gina, p. 48

Code.groovy

Code.groovy

groovyc

Java class loader Groovy class loader

Code.class

Loaded class Loaded class

6Meta-programming in Groovy

Groovy programming concepts

Beauty through brevity

7Meta-programming in Groovy

Expose the Magic

Running Example

class Dog {

String name = 'dog'

void bark() {

System.out.println "$name: woof"

}

String toString() {

name

}

}

8Meta-programming in Groovy

Metaclasses in Groovy

9Meta-programming in Groovy

Creating Objects

10Meta-programming in Groovy

static void main(args) {new Dog()

}

ScriptBytecodeAdapter.invokeNewN( DogExample.class, Dog.class, new Object[0])

Getting Metaclass for Classes

11Meta-programming in Groovy

static void main(args) {new Dog()

}

ScriptBytecodeAdapter.invokeNewN( DogExample.class, Dog.class, new Object[0])

Example for Custom Metaclass

12Meta-programming in Groovy

class WaldiMeta extends MetaClassImpl {

WaldiMeta() {

super(GroovySystem.getMetaClassRegistry(), Dog.class)

initialize()

}

}

// Instance-based MetaClass

waldi = new Dog(name: 'Waldi')

waldi.metaClass = new WaldiMeta()

// Class-based MetaClass

GroovySystem.getMetaClassRegistry().setMetaClass(Dog.class, new WaldiMeta())

waldi = new Dog(name: 'Waldi')

Method Invocation

13Meta-programming in Groovy

static void main(args) {dog = new Dog()dog.bark()

}

ScriptBytecodeAdapter. invokeMethodN( DogExample.class, dog, "bark", new Object[0])

Intercepting Method Calls

14Meta-programming in Groovy

static void main(args) {dog = new Dog()dog.bark()

}

ScriptBytecodeAdapter. invokeMethodN( DogExample.class, dog, "bark", new Object[0])

Interception in GroovyInterceptable

15Meta-programming in Groovy

class InterceptingDog extends Dog implements GroovyInterceptable {

Object invokeMethod(name, args) {

System.out.println "$this is about to $name"

metaClass.invokeMethod(this, name, args)

}

}

dog = new InterceptingDog(name: 'Waldi')

dog.bark()

Waldi is about to bark

Waldi: woof

Interception using Interceptor

16Meta-programming in Groovy

class InterceptingNeighbor implements Interceptor {

String action

Object beforeInvoke(object, methodName, arguments) {

action = methodName

}

boolean doInvoke() {

if(action != 'bark') return true

println "Neighbor intercepted barking"

false

}

}

proxy = ProxyMetaClass.getInstance(Dog.class)

proxy.interceptor = new InterceptingNeighbor()

proxy.use {

dog = new Dog()

dog.bark()

}

Neighbor intercepted barking

Interception with MetaClass

17Meta-programming in Groovy

class BrunoMeta extends MetaClassImpl {

Object invokeMethod(sender, object, methodName, originalArguments,

isCallToSuper, fromInsideClass) {

println "$object is about to $methodName"

super.invokeMethod(sender, object, methodName, originalArguments,

isCallToSuper, fromInsideClass)

}

Object invokeMissingMethod(instance, methodName, arguments) {

println "$instance does not $methodName"

}

}

dog = new Dog(name: 'Waldi')

dog.metaClass = new BrunoMeta()

dog.bark()

dog.speak()

Waldi is about to bark

Waldi: woof

Waldi is about to speak

Waldi does not speak

Evaluating Expressions

18Meta-programming in Groovy

static void main(args) {shell = new GroovyShell()shell.evaluate("1+1")

}

Become Magician

19Meta-programming in Groovy

Keep It Simple

20Meta-programming in Groovy

Class

XML

Application

TableHibernate

Keep It Simple

21Meta-programming in Groovy

Class

Application

TableEJB

Keep It Simple

22Meta-programming in Groovy

Application

TableGroovy

Meta-programming in Groovy

• Introspection: fully integrated• GroovyObject: getMetaClass, getProperty

• MetaClass: getProperties, getMethods, getMetaMethods

• Intercession:• Interception:

• GroovyInterceptable: pretend to have function, error handling

• Interceptor: scope-level; useful for AOP, e.g. logging

• MetaClass: change or observe behavior on class-level

• Expando: dynamic behavior and properties on instance-level

• ExpandoMetaClass: most powerful, dynamic on class-level

23Meta-programming in Groovy

We love you …

24Meta-programming in Groovy

References

• [Gina]: Dierk Koenig: Groovy in Action

• Codehaus Documentation

http://groovy.codehaus.org/Documentation

• Practically Groovy

http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=practically+groovy

• Groovy Source Code and Mailing List

25Meta-programming in Groovy