类创建实例一般方式
http://groovy-lang.org/objectorientation.html#_class
class Person { String name Integer age def increaseAge(Integer years) { this.age += years } }
def p = new Person()
类作为参数传递
有些场景下,需要将类作为变量传递
http://groovy-lang.org/objectorientation.html#_class
class Runner { static <T> T run(Class<T> taskClass) { def tasks = taskClass.newInstance() def params = [jdk:6, windows: false] tasks.class.declaredMethods.each { m -> if (Modifier.isPublic(m.modifiers) && m.parameterTypes.length == 0) { def onlyIf = m.getAnnotation(OnlyIf) if (onlyIf) { Closure cl = onlyIf.value().newInstance(tasks,tasks) cl.delegate = params if (cl()) { m.invoke(tasks) } } else { m.invoke(tasks) } } } tasks } }
// create a new instance of the class passed as an argument (the task class)
DEMO2 抽象工厂
http://groovy-lang.org/design-patterns.html#_example
def guessFactory = [messages: GuessGameMessages, control: GuessGameControl, converter: GuessGameInputConverter] def twoupFactory = [messages: TwoupMessages, control: TwoupControl, converter: TwoupInputConverter] class GameFactory { def static factory def static getMessages() { return factory.messages.newInstance() } def static getControl() { return factory.control.newInstance() } def static getConverter() { return factory.converter.newInstance() } }
GameFactory.factory = twoupFactory def messages = GameFactory.messages def control = GameFactory.control def converter = GameFactory.converter println messages.welcome def reader = new BufferedReader(new InputStreamReader(System.in)) while (control.moreTurns()) { def input = reader.readLine().trim() control.play(converter.convert(input)) } println messages.done
DEMO3 -- 变量
class Greet {
def salute() { println "Hello !" }
}
g = new Greet() // create object
g.salute()
def class_var = Greet
// h = new class_var()
h = class_var.newInstance()
h.salute()