gpt4 book ai didi

grails - Groovy MetaClass-将类别方法添加到适当的metaClasses

转载 作者:行者123 更新时间:2023-12-02 14:21:53 26 4
gpt4 key购买 nike

我在Grails插件中使用了几种类别。例如。,

class Foo {
static foo(ClassA a,Object someArg) { ... }
static bar(ClassB b,Object... someArgs) { ... }
}

我正在寻找将这些方法添加到元类的最佳方法,这样我就不必使用类别类,而可以将它们作为实例方法来调用。例如。,
aInstance.foo(someArg)

bInstance.bar(someArgs)

是否有Groovy / Grails类或方法可以帮助我做到这一点,或者我一直在遍历这些方法并自己添加所有方法?

最佳答案

在Groovy 1.6中,引入了一种使用类别/混合器的简单得多的机制。以前,必须将类别类的方法声明为静态,并且第一个参数指示可以将它们应用于哪些对象类(如上述Foo类中所述)。

我觉得这有点尴尬,因为一旦将类别的方法“混入”到目标类中,它们便是非静态的,但在类别类中便是静态的。

无论如何,由于Groovy 1.6,您可以改为执行此操作

// Define the category
class MyCategory {
void doIt() {
println "done"
}

void doIt2() {
println "done2"
}
}

// Mix the category into the target class
@Mixin (MyCategory)
class MyClass {
void callMixin() {
doIt()
}
}

// Test that it works
def obj = new MyClass()
obj.callMixin()

其他一些功能也可用。如果要限制可以应用类别的类,请使用 @Category批注。例如,如果您只想将 MyCategory应用于 MyClass(或其子类),则将其定义为:
@Category(MyClass)
class MyCategory {
// Implementation omitted
}

您无需在编译时使用 @Mixin混合类别(如上所述),而可以在运行时混合使用以下类别:
MyClass.mixin MyCategory

在使用Grails时,可以在 Bootstrap.groovy中进行此操作。

关于grails - Groovy MetaClass-将类别方法添加到适当的metaClasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387434/

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