Grails: ExpandoMetaClass для метода

#grails #groovy #expandometaclass

#grails #groovy #expandometaclass

Вопрос:

Рассмотрим метод

  def public Set<AgeRange> getAgeRanges(boolean excludeSenior) {
           -- something ---
     }
  

как написать ExpandoMetaClass для этого, например

     ClassName.metaClass.methodName << { boolean excludeSenior->
           -- something ---
       }
  

Ответ №1:

Я попробовал это в консоли Groovy, и это сработало:

 class Something {

    Set getAgeRanges(boolean excludeSenior) {
        [1, 2, 3] as Set
    }
}

// test the original method
def s = new Something()
assert s.getAgeRanges(true) == [1, 2, 3] as Set

// replace the method
Something.metaClass.getAgeRanges = { boolean excludeSenior ->
    [4, 5, 6] as Set
}

// test the replacement method
s = new Something()
assert s.getAgeRanges(true) == [4, 5, 6] as Set
  

Ответ №2:

Я не совсем уверен, о чем вы спрашиваете, но это может продемонстрировать то, что вы ищете:

Некоторый класс:

 class SomeClass {
    List<Integer> ages
}
  

Некоторое метапрограммирование для добавления метода в класс:

 SomeClass.metaClass.agesOlderThan { int minimumAge ->
    // note that "delegate" here will be the instance
    // of SomeClass which the agesOlderThan method
    // was invoked on...
    delegate.ages?.findAll { it > minimumAge }
}
  

Создайте экземпляр SomeClass и вызовите новый метод…

 def sc = new SomeClass(ages: [2, 12, 22, 32])

assert sc.agesOlderThan(20) == [22, 32]
  

Это помогает?