首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java中的Groovy向类添加方法

使用Java中的Groovy向类添加方法
EN

Stack Overflow用户
提问于 2015-09-02 10:32:27
回答 1查看 2K关注 0票数 5

我正在开发一个使用Groovy作为编译时依赖项的Java模块,我想在不编写Groovy代码的情况下向我的Person类(如Groovy JDK)添加一个方法。

在Groovy中,我会这样实现它

代码语言:javascript
复制
Person.meta.doSomething = { String param -> println "do something: ${param}" }

我如何使用Groovy表单Java来实现呢?

编辑1:

到目前为止,我已经实施了以下措施,而且我几乎做到了这一点。我为Person实例化了一个Expando类,并注册了一个MethodClosure,它将方法调用委托给类PersonDefaultMethods中的一个方法。

代码语言:javascript
复制
ExpandoMetaClass expando = new ExpandoMetaClass (Person.class, true, false);
expando.registerInstanceMethod ("format", new MethodClosure (new PersonDefaultMethods(), "format"));
expando.initialize ();

PersonDefaultMethods包含我在Expando类中声明的方法的实现。

代码语言:javascript
复制
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:

在我的实现中,使用闭包子类或匿名闭包类的方法失败。

代码语言:javascript
复制
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 ();

这就是我的工作。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-02 13:16:42

您可以通过GroovySystem.getMetaClassRegistry().getMetaClass(Person.class);更好地获得当前的元类。但是要模拟上面的内容,您需要手动完成Groovy在后台为您做的几件事情。

  • 首先,您将需要一个ExpandoMetaClass (短电磁兼容)。如果上面的元类不是EMC,则需要创建一个元类并在注册表:ExpandoMetaClass emc = new ExpandoMetaClass(Person.class)中注册它。
  • 接下来,您需要使用字符串和闭包或registerInstanceMethod调用MetaMethod。上面的变体是闭包版本,并将在后台调用另一个版本。
  • 要遵循Groovy约定,您需要创建一个闭包子类(可能是匿名子类),其中包含您想要的方法的签名的doCall方法。registerInstanceMethod的字符串将是方法的名称。
  • 当然,您也可以利用一个现有的MetaMethod子类(或您自己的子类)来达到这个目的。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32350797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档