4

我想使用 groovy 的 mixin 功能将方法导入为“类(静态)方法”而不是实例方法。当我使用 mixin 时,即使我的 mixin 类中有一个静态方法,它也会转换为目标类中的实例方法。我希望导入的方法是类(静态)方法。有没有好的方法呢?

4

3 回答 3

3

我不知道使用 mixins 将静态方法添加到类中的任何方法,但是您可以通过metaClass.static属性将静态方法添加到类中。这是一个示例,它添加了一个fqn()打印类的完全限定名称的静态方法

Class.metaClass.static.fqn = { delegate.name }
assert String.fqn() == "java.lang.String"

如果您想将fqn()(和其他静态方法)添加到多个类(例如 List、File、Scanner),您可以执行类似的操作

def staticMethods = [fqn: {delegate.name}, fqnUpper: {delegate.name.toUpperCase()}]    

[List, File, Scanner].each { clazz ->

    staticMethods.each{methodName, methodImpl ->
        clazz.metaClass.static[methodName] = methodImpl
    }
}
于 2010-03-22T14:45:39.290 回答
1

我在上面 +1'd Don's 回复。

这是我为解决我想要@Mixin 的闭包的静态混合问题所做的工作。

Class Foo {

    static a = {}
    static b = {}
    static c = {}
}

Class Bar {}

def meths = Foo.metaClass.properties.findAll{it.type==Object}.collect{it.name}  
meths.each {Bar.metaClass.static."$it" = A."$it"}
于 2011-03-06T18:46:38.897 回答
0

我希望将来有可能,这意味着何时修复此错误:http: //jira.codehaus.org/browse/GROOVY-4370(使用静态方法混合一个类无法正常工作)

于 2011-08-23T12:46:44.697 回答