gpt4 book ai didi

java - 在 Java 中使用 Groovy 向类添加方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:24 26 4
gpt4 key购买 nike

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

在 Groovy 中我会那样实现它

Person.meta.doSomething = { String param -> println "do something: ${param}" }

如何使用来自 Java 的 Groovy API 来实现?

编辑 1:

到目前为止,我已经实现了以下内容,而且我快完成了。我为 Person 实例化了一个 Expando 类,并注册了一个 MethodClosure,它将方法调用委托(delegate)给 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 脚本时,我可以在 Person 实例上调用 format 方法,但我无法访问 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 ();

这就完成了工作。谢谢。

最佳答案

您可以通过 GroovySystem.getMetaClassRegistry().getMetaClass(Person.class); 更好地获取当前元类。但是要模拟上面的内容,您需要手动执行几项 Groovy 在后台为您执行的操作。

  • 首先,您需要一个ExpandoMetaClass(简称EMC)。如果上面的元类不是 EMC,您将需要创建一个并在注册表中注册它:ExpandoMetaClass emc = new ExpandoMetaClass(Person.class)
  • 接下来,您需要使用字符串和闭包或元方法调用 registerInstanceMethod。上面的变体是 Closure 版本,会在后台调用另一个。
  • 要遵循 Groovy 约定,您需要使用 Signature 的 doCall 方法创建一个 Closure 子类(可能是匿名的),您希望您的方法是这样的。 registerInstanceMethod 的字符串将是方法的名称
  • 当然,您也可以利用现有的 MetaMethod 子类之一(或您自己的子类)实现这一目标。

关于java - 在 Java 中使用 Groovy 向类添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32350797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com