【发布时间】:2012-03-23 08:52:01
【问题描述】:
我想创建一个简单的包装器,它允许将对象方法作为流畅的接口调用。我一直在考虑在创建时重写类的方法,但这似乎不起作用。这是否可以通过 groovy 元编程以某种方式实现?
到目前为止我有这种代码sn-p:
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。
【问题讨论】:
标签: groovy metaprogramming dsl