Groovy 类名称赋值为变量使用(newInstance & new)

时间:2022-05-03 17:04:45

类创建实例一般方式

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()