Gradle自动化构建(五) Groovy OOP、元编程

###OOP
interface Itf {
void eat()
void drink() // 接口中只能定义 public 的接口
}

trait Trait { // trait 类似于接口,又类似于 抽象类,trait 中不实现的函数必须要用 abstract 修饰 。 也是用 implement 关键字 实现
    abstract void hehe()
    void go() { }
}

class Oop implements Itf, Trait { // groovy中,所有类型默认都是 public 的,groovy的最基类 GroovyObject
    String name // 成员属性的默认值同java一样
    int age // 编译器会自动为成员属性添加 get set 方法
    def increase(int years) { // 函数返回值类型定义为 def ,表示返回的是 GroovyObject
        name += years
    }

    @Override
    void eat() { }

    @Override
    void drink() { }

    @Override
    void hehe() { }

    // 当此类的对象调用此类中没有的函数时,那么最终会调用这个函数
    def invokeMethod(String name, Object args) { // name 表示要调的函数的名称,args 是要调的函数的参数 , 继承自 GroovyObject
        return "invokeMethod method is $name, param is $args"
    }

    def methodMissing(String name, Object args) { // name 表示要调的函数的名称,args 是要调的函数的参数
        return "methodMissing method is $name, param is $args"
    }

}

def oop = new Oop(name: 'abc', age: 11) // groovy不用指定构造函数,在 new 的时候就可以为成员属性赋值
println oop.getName() // oop.name 实际调用的是 oop.getName()

运行时:
这里写图片描述

###元编程(在运行时注入代码)
def op = new Oop()
// invokeMethod method is haha, param is [] , Oop 只实现 GroovyObject 的 invokeMethod 函数时, 打印结果
// methodMissing method is haha, param is [] , 还实现了 methodMissing 时,打印结果
println op.haha()

// metaClass 来自于 DefaultGroovyMethods 类中的 getMetaClass ,最终来自于最基类 GroovyObject
// 为类动态的添加一个属性,只有在这个设置之后创建的对象才可以使用该属性,之前的对象使用会报错
Oop.metaClass.sex = 'male' // 这之后的所有 Oop 的对象都有一个 sex = 'male' 的成员
Oop o = new Oop()
println o.sex // male
o.sex = "female" // 仅仅只是修改 o 此次实例的属性值
println o.sex // female
println new Oop().sex // male

// 为类动态的添加一个函数
Oop.metaClass.sexUpperCase = { -> sex.toUpperCase() } // 闭包中不能用 it ? 需要指明参数的个数,及使用的变量名
Oop pp = new Oop()
println pp.sexUpperCase() // MALE

// 动态添加静态成员函数,无法动态添加静态的成员属性 ?
// 这样动态注入的这些成员,在另一个脚本里的Oop对象中是没有的,要想只注入一次,然后全局使用,需要 ExpandoMetaClass.enableGlobally() ,这句代码调用之后的动态注入就是全局的了
Oop.metaClass.static.staticMethod = { String name, int age -> new Oop(name: name, age: age) }
println Oop.staticMethod('na', 23).name // na
//Oop.metaClass.static.some = "some"
//Oop po = new Oop()
//println po.some
//po.some = "num"
//println Oop.some


class AppMng {
    static void init() {
        ExpandoMetaClass.enableGlobally() // 要想只注入一次,然后全局使用,需要 ExpandoMetaClass.enableGlobally() ,这句代码调用之后的动态注入就是全局的了
        Oop.metaClass.static.createOop = { String name, int age -> new Oop(name: name, age: age) }
    }
}
class OopMng {
    static Oop createOop(String name, int age) {
        return Oop.createOop(name, age)
    }
}
class Entry {
    static void main(def args) {
        AppMng.init()
        Oop op = OopMng.createOop('liy', 18)
        println op.name // liy
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值