Я хотел бы создать простую оболочку, которая позволила бы использовать методы объектов в качестве свободного интерфейса. Я думал о методах перезаписи класса при создании, но это, похоже, не работает. Возможно ли это каким-то образом с помощью метафорирования?groovy generic fluent builder
У меня есть такой фрагмент кода до сих пор:
class FluentWrapper {
def delegate
FluentWrapper(wrapped) {
delegate = wrapped
delegate.class.getMethods().each { method ->
def name = method.getName()
FluentWrapper.metaClass."$name" = { Object[] varArgs ->
method.invoke(wrapped, name, varArgs)
return this
}
}
}
def methodMissing(String name, args) {
def method = delegate.getClass().getDeclaredMethods().find { it.match(name) }
if(method) {
method.invoke(delegate,name, args)
return FluentWrapper(delegate)
}
else throw new MissingMethodException(name, delegate, args)
}
}
Допуская пример Java класс:
class Person {
void setAge()
void setName()
}
я хотел бы быть в состоянии выполнить следующий фрагмент кода:
def wrappedPerson = new FluentWrapper(new Person())
wrappedPerson.setAge().setName()
Я использую Groovy 1.6.7 для этого.
Отлично, поэтому использование новой версии - это то, что я должен был сделать :) Я проверю это в понедельник. –
Это работало как шарм :) Спасибо. –