一、trait类
与接口有点像,但可以编写不需要继承的方法,类似抽象类。继承方式还是implements
trait DefaultAction {abstract void eat()void play(){println "play happy"}}
二、元编程
编写代码执行的时期,比如解释执行的js,编译执行的java,运行时期指定的反射
1、找不到方法的执行时期

首先一个对象,会先判断类是否有方法,然后判断metaClass有没有此方法,跟java一致。
如果还没找到,会执行methodMissing,如果也没有此方法,会执行invokeMethod,如果没有,则报错。
class Personal{String nameString age/*** 一个方法找不到时,调用它替换*/def invokeMethod(String name,Object args){return "invokeMethod this name {$name} args {$args}"}//比invokeMethod优先级高def methodMissing(String name,Object args){return "methodMissing this name {$name} args {$args}"}}def person=new Personal(name:"Qndroid",age:26)println person.cry("Sdfs",23) //会执行methodMissing

2、动态添加参数与方法
//为类动态的添加一个属性Personal.metaClass.sex='male'//为类动态添加一个方法Personal.metaClass.sexUpperCase={ ->sex.toUpperCase()}//为类添加一个静态方法Personal.metaClass.static.createPerson={String name,int age->new Personal(name:name,age:age)}def person2=new Personal(name:"Qndroid",age:26)println person2.sexprintln person2.sexUpperCase()def person3=Personal.createPerson('rezhi',22)println person3.name +","+ person3.age
意义:比如一些第三方库,有一些你想用的方法,但方法不够全,你又想向里面写一些类。但有些没法继承,便可以往里面新增方法和参数。
