如何使用groovy mixin添加静态方法

时间:2010-03-22 05:42:10

标签: groovy static methods mixins

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

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

我在上面给出了Don的回复。

这是我为了解决我想要@Mixin的闭包的静态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"}

答案 2 :(得分:0)

我希望将来可能会修复这个错误:http://jira.codehaus.org/browse/GROOVY-4370(使用静态方法混合类不能正常工作)