混合类的Groovy Mixin使用方法

混合类的Groovy Mixin使用方法,groovy,mixins,Groovy,Mixins,考虑一个mixin类 class StringPlusMixin { String plus(String other) { return toString() + other } } 以及他的用例 @Mixin(StringPlusMixin) class POGO { String descr String toString(){ return descr } } 有没有办法让SringPlusMixin使用POGO#toString()而不是Srin

考虑一个mixin类

class StringPlusMixin {
  String plus(String other) {
    return toString() + other
  }
}
以及他的用例

@Mixin(StringPlusMixin)
class POGO {
  String descr
  String toString(){
    return descr
  }
}
有没有办法让
SringPlusMixin
使用
POGO#toString()
而不是
SringPlusMixin#toString()

实际输出为:

POGO pogo = new POGO(descr: "POGO description");
System.out.println(pogo + "Some message."); //StringPlusMixin@f410f8 Some message.

我正在考虑使用这个mixin,因为Groovy默认的
instance+String
是尝试调用
plus()
方法。我在几个Java类中使用了我的
POGO
,并试图不需要将所有消息更改为使用
toString()

反射?另外,我将您的类转换为一个类别,方法是静态的,并将子对象作为第一个参数传递

更新:根据注释,从mixin方法中删除了该类型

import org.codehaus.groovy.runtime.InvokerHelper as Invoker

class StringPlusMixin {
  static String plus(pogo, String other) {
    def toString = pogo.class.declaredMethods.find { it.name == "toString" }
    return toString.invoke(pogo) + other
  }
}


@Mixin(StringPlusMixin)
class POGO {
  String descr
  String toString(){
    return descr
  }
}


pogo = new POGO(descr: "POGO description")
assert pogo + " Some message." == "POGO description Some message."

反思?另外,我将您的类转换为一个类别,方法是静态的,并将子对象作为第一个参数传递

更新:根据注释,从mixin方法中删除了该类型

import org.codehaus.groovy.runtime.InvokerHelper as Invoker

class StringPlusMixin {
  static String plus(pogo, String other) {
    def toString = pogo.class.declaredMethods.find { it.name == "toString" }
    return toString.invoke(pogo) + other
  }
}


@Mixin(StringPlusMixin)
class POGO {
  String descr
  String toString(){
    return descr
  }
}


pogo = new POGO(descr: "POGO description")
assert pogo + " Some message." == "POGO description Some message."
在POGO中使用转换

@Mixin(StringPlusMixin)
class POGO {
  @Delegate String descr
  String toString(){
    return descr
  }
}
由于
descr
归POGO所有,因此运行时
descr
的使用被授予POGO所有者。

在POGO中使用转换

@Mixin(StringPlusMixin)
class POGO {
  @Delegate String descr
  String toString(){
    return descr
  }
}

由于
descr
归POGO所有,因此运行时
descr
的使用权归POGO所有。

这样,Mixin(StringPlusMixin)不是与POGO紧密耦合吗?如果我有
POGO1
使用这个Mixin,我将如何处理?使用POGO和POGO1实现它来创建类别接口?其想法是将StringPlusixin应用于任何类,因此创建一个紧密耦合的静态方法对我没有帮助,但感谢您的回答。@SérgioMichels类别可以是动态的。更新了代码。@是否有任何理由将plus方法设置为静态的mixin实现?看起来这似乎只是一个公开的话题,我缺少了什么?@SérgioMichels Mixin类被视为一个类别。看看这个,这不是Mixin(StringPlusMixin)与POGO紧密耦合的方式吗?如果我有
POGO1
使用这个Mixin,我将如何处理?使用POGO和POGO1实现它来创建类别接口?其想法是将StringPlusixin应用于任何类,因此创建一个紧密耦合的静态方法对我没有帮助,但感谢您的回答。@SérgioMichels类别可以是动态的。更新了代码。@是否有任何理由将plus方法设置为静态的mixin实现?看起来这似乎只是一个公开的话题,我缺少了什么?@SérgioMichels Mixin类被视为一个类别。看看这个。我测试过这个,效果很好!对我来说,如果直接使用
StringPlusMixin
描述
。我仍然不清楚为什么Groovy属性中的@Delegate开始调用POGO的
toString()
,而不是
StringPlusMixin的
toString()
。例如,如果我将方法更改为:
String-toString(){return“[$descr]”}
,这仍然有效。我理解,它在这里工作得很好,因为@Delegate覆盖了所有内容(甚至是mixin),并尝试调用String类的默认
toString()
。但在本例中,
toString
已被POGO覆盖,请在运行时使用它!对我来说,如果直接使用
StringPlusMixin
描述
。我仍然不清楚为什么Groovy属性中的@Delegate开始调用POGO的
toString()
,而不是
StringPlusMixin的
toString()
。例如,如果我将方法更改为:
String-toString(){return“[$descr]”}
,这仍然有效。我理解,它在这里工作得很好,因为@Delegate覆盖了所有内容(甚至是mixin),并尝试调用String类的默认
toString()
。但在这种情况下,
toString
已被POGO覆盖,它在运行时使用它。