【问题标题】:how to add static methods using groovy mixin如何使用 groovy mixin 添加静态方法
【发布时间】:2011-01-30 05:13:12
【问题描述】:

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

【问题讨论】:

    标签: groovy static methods mixins


    【解决方案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】:

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

      【讨论】:

        【解决方案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-11-30
          • 1970-01-01
          • 2013-05-18
          • 2011-05-07
          • 2019-01-04
          • 2011-01-30
          • 2011-07-02
          • 2015-05-29
          • 2022-11-11
          相关资源
          最近更新 更多