我正在开发一个使用Groovy作为编译时依赖项的Java模块,我想在不编写Groovy代码的情况下向我的Person类(如Groovy JDK)添加一个方法。
在Groovy中,我会这样实现它
Person.meta.doSomething = { String param -> println "do something: ${param}" }我如何使用Groovy表单Java来实现呢?
编辑1:
到目前为止,我已经实施了以下措施,而且我几乎做到了这一点。我为Person实例化了一个Expando类,并注册了一个MethodClosure,它将方法调用委托给类PersonDefaultMethods中的一个方法。
ExpandoMetaClass expando = new ExpandoMetaClass (Person.class, true, false);
expando.registerInstanceMethod ("format", new MethodClosure (new PersonDefaultMethods(), "format"));
expando.initialize ();PersonDefaultMethods包含我在Expando类中声明的方法的实现。
public class PersonDefaultMethods {
public String format(String format) {
return this.toString(); // this one gets called
}
public String format(Person self, String format) { // but I want this method to be called
return self.getFirstname() + " " + self.getLastname();
}
}当我知道在这个上下文中执行一个Groovy脚本时,我可以在一个format实例上调用Person方法,但是我无法像通常使用闭包那样访问delegate。
编辑2:
在我的实现中,使用闭包子类或匿名闭包类的方法失败。
ExpandoMetaClass expando = new ExpandoMetaClass(Person.class, true, false);
expando.registerInstanceMethod("format", new Closure(this) {
@Override
public Object call(Object arguments) {
return super.call(arguments);
}
@Override
public Class[] getParameterTypes () {
return new Class[] { String.class};
}
});
expando.initialize ();这就是我的工作。谢谢。
发布于 2015-09-02 13:16:42
您可以通过GroovySystem.getMetaClassRegistry().getMetaClass(Person.class);更好地获得当前的元类。但是要模拟上面的内容,您需要手动完成Groovy在后台为您做的几件事情。
ExpandoMetaClass (短电磁兼容)。如果上面的元类不是EMC,则需要创建一个元类并在注册表:ExpandoMetaClass emc = new ExpandoMetaClass(Person.class)中注册它。registerInstanceMethod调用MetaMethod。上面的变体是闭包版本,并将在后台调用另一个版本。registerInstanceMethod的字符串将是方法的名称。https://stackoverflow.com/questions/32350797
复制相似问题