Gradle基础到进阶——Groovy动态特性和元编程(二)

2021-08-05  本文已影响0人  Peakmain

groovy动态特性

动态/静态类型语言

Groovy的动态特性

class Person{
    def name="peakmain"

    void setName(String name) {
        println("setName(String name)")
        this.name = name
    }
    void setName(Object name) {
        println("setName(Object name)")
        this.name = name
    }
}
def person=new Person()
Object name="treasure"
person.name=name

我们会发现name最后一次赋值的类型是String,所以打印的结果是setName(String name)

元编程

MOP方法拦截

class Person implements GroovyInterceptable {
   def func() {
       println("I am func ")
   }

   @Override
   Object invokeMethod(String name, Object args) {
       System.out.println("$name invokeMethod")
       System.out.println("$metaClass invokeMethod")
       //respondsTo(name)//判断是否存在
       if(metaClass.invokeMethod(this,"respondsTo",name,args)){
           System.out.println("$name 方法存在")
           metaClass.invokeMethod(this,name,args)
       }

   }
}

new Person().func()
class Person {
    def func() {
        println("I am func ")
    }
}

def person = new Person()
//只拦截某个对象的某一个方法
person.metaClass.func = {
    println("I am metaClass func ")
}
//多个方法
person.metaClass.invokeMethod = {
    String name, Object args ->
        println("I am $name 被拦截了 ")
}
person.func()

toString的拦截

String.metaClass.invokeMethod={
    String name,Object args->
        MetaMethod metaMethod=delegate.metaClass.getMetaMethod(name)
        if(metaMethod!=null&&name=="toString"){
            "peakmain"
        }
}
println "hello".toString()

MOP方法注入

class Person {
    def func() {
        println("I am Person func ")
    }
}
def person=new Person()
person.metaClass.newFunc={
    println("I am metaClass newFunc ")
}
person.newFunc()
def expandoMetaClass = new ExpandoMetaClass(Person)
expandoMetaClass.func1 = {
    println("I am expandoMetaClass func1 ")
}
expandoMetaClass.initialize()
Person.metaClass=expandoMetaClass
new Person().func1()

写法一

class Utils{
   static def isEmpty(String name){
       println("isEmpty")
       name.length()==0||name==null
   }
}
use(Utils){
   "".isEmpty()
}

写法二

@Category(String)
class Utils{
     def isEmpty(){
        println("isEmpty")
        this.length()==0||this==null
    }
}
use(Utils){
    "".isEmpty()
}

MOP方法合成

MOP方法委托

def e=new Expando(name:"peakmain",func:{
    println("func")
})
e.name="haha"
println(e.name)

运算符重载

简单案例:重载+

Integer.metaClass.plus = {
    int a ->
       "$delegate+$a"
}
println(1+2)
方法 重载
a + b a.plus(b)
a – b a.minus(b)
a * b a.multiply(b)
a ** b a.power(b)
a / b a.div(b)
a % b a.mod(b)
a & b a.and(b)
a ^ b a.xor(b)
a++ or ++a a.next()
a– or –a a.previous()
a[b] a.getAt(b)
a[b] = c a.putAt(b, c)
a << b a.leftShift(b)
a >> b a.rightShift(b)
~a a.bitwiseNegate()
-a a.negative()
上一篇 下一篇

猜你喜欢

热点阅读