Groovy从多个对象复制/组合元方法

Groovy从多个对象复制/组合元方法,groovy,metaclass,metaobject,Groovy,Metaclass,Metaobject,我有两节课。在运行时,我想将一个对象的方法“克隆”到另一个对象。这可能吗?我使用leftshift失败的尝试如下所示 (注意:我还尝试了currMethod.clone(),得到了相同的结果。) 一个具有特征的基本示例: trait Speak { String speak() { println 'bow wow' } } class MyClass { } def instance = new MyClass() def extended = insta

我有两节课。在运行时,我想将一个对象的方法“克隆”到另一个对象。这可能吗?我使用leftshift失败的尝试如下所示

(注意:我还尝试了currMethod.clone(),得到了相同的结果。)


一个具有特征的基本示例:

trait Speak {
    String speak() {
        println 'bow wow'
    }
}

class MyClass {

}

def instance = new MyClass()
def extended = instance.withTraits Speak

extended.speak()
您可以选择在运行时使用哪个特征:

def clientTrait = Speak
def sb = new Object().withTraits(clientTrait)

sb.speak()
并使用类加载器动态加载trait:

def clientTrait = this.class.classLoader.loadClass "my.package.${client}Speak"
def sb = new Object().withTraits(clientTrait)

你试过性格特征吗?你为什么要做这样的事?你的要求是什么?tbh,这看起来不是一个好主意是的,我广泛地使用特征,这是一个多么惊人的特性。我想我明白你使用特征的原因了。我可以利用本机冲突处理的特性,让第二个类覆盖第一个类。这也许行得通!只是从来没有使用过冲突处理,所以没有想过用它来设计。请注意,当通过元类添加方法时,源代码是一个闭包,而不是文本。因此,您可以在某些类中将方法转换为闭包属性。我还是会先尝试使用一种特质。谢谢!实际上,我已经使用了这些特性,我也从来没有使用过使用特征法,所以我会考虑。在你的例子中,如果“MyClass”已经有了一个speak方法,那么在这种情况下trait会被覆盖吗?是的,使用
withTraits
,这个方法会被覆盖。我刚刚更新了原始帖子,问了一个关于如何更动态地执行此操作的问题。如果可能的话,你能告诉我吗?或者类似的东西?是的,它是有效的,我已经在我的答案中添加了它,但是clientTrait应该是一个
,而不是StringSorry,我认为仍然缺少一些东西。客户端名称以字符串形式输入。此客户端名称将是特征名称的一部分。我们可以基于字符串动态指定要实现的特征名称吗?
def clientTrait = Speak
def sb = new Object().withTraits(clientTrait)

sb.speak()
def clientTrait = this.class.classLoader.loadClass "my.package.${client}Speak"
def sb = new Object().withTraits(clientTrait)