考虑一个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()
。
答案 0 :(得分:2)
反射?此外,我将您的类转换为类别,方法是将方法设为静态并将子对象作为第一个参数传递。
更新:根据评论,从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."
答案 1 :(得分:2)
在POGO中使用@Delegate转换。
@Mixin(StringPlusMixin)
class POGO {
@Delegate String descr
String toString(){
return descr
}
}
由于descr
归POGO所有,因此在运行时使用descr
会将所有权分配给POGO。