zoukankan      html  css  js  c++  java
  • Groovy 类名称赋值为变量使用(newInstance & new)

    类创建实例一般方式

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

  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/lightsong/p/8655019.html
Copyright © 2011-2022 走看看