一、trait类

与接口有点像,但可以编写不需要继承的方法,类似抽象类。继承方式还是implements

  1. trait DefaultAction {
  2. abstract void eat()
  3. void play(){
  4. println "play happy"
  5. }
  6. }

二、元编程

编写代码执行的时期,比如解释执行的js,编译执行的java,运行时期指定的反射

1、找不到方法的执行时期

image.png
首先一个对象,会先判断类是否有方法,然后判断metaClass有没有此方法,跟java一致。
如果还没找到,会执行methodMissing,如果也没有此方法,会执行invokeMethod,如果没有,则报错。

  1. class Personal{
  2. String name
  3. String age
  4. /**
  5. * 一个方法找不到时,调用它替换
  6. */
  7. def invokeMethod(String name,Object args){
  8. return "invokeMethod this name {$name} args {$args}"
  9. }
  10. //比invokeMethod优先级高
  11. def methodMissing(String name,Object args){
  12. return "methodMissing this name {$name} args {$args}"
  13. }
  14. }
  15. def person=new Personal(name:"Qndroid",age:26)
  16. println person.cry("Sdfs",23) //会执行methodMissing

image.png

2、动态添加参数与方法

  1. //为类动态的添加一个属性
  2. Personal.metaClass.sex='male'
  3. //为类动态添加一个方法
  4. Personal.metaClass.sexUpperCase={ ->
  5. sex.toUpperCase()
  6. }
  7. //为类添加一个静态方法
  8. Personal.metaClass.static.createPerson={
  9. String name,int age->new Personal(name:name,age:age)
  10. }
  11. def person2=new Personal(name:"Qndroid",age:26)
  12. println person2.sex
  13. println person2.sexUpperCase()
  14. def person3=Personal.createPerson('rezhi',22)
  15. println person3.name +","+ person3.age

意义:比如一些第三方库,有一些你想用的方法,但方法不够全,你又想向里面写一些类。但有些没法继承,便可以往里面新增方法和参数。