4

groovy の mixin 機能を使用して、メソッドをインスタンス メソッドではなく「クラス (静的) メソッド」としてインポートしたいと考えています。ミックスイン クラスに静的メソッドがあるにもかかわらず、ミックスインを使用すると、宛先クラスのインスタンス メソッドに変換されます。インポートされたメソッドをクラス (静的) メソッドにしたいのですが、良い方法はありますか?

4

3 に答える 3

3

ミックスインを使用して静的メソッドをクラスに追加する方法はわかりませんが、metaClass.staticプロパティを介して静的メソッドをクラスに追加できます。fqn()クラスの完全修飾名を出力する静的メソッドを追加する例を次に示します。

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

(およびその他の静的メソッド) を複数のクラス (List、File、Scanner など)に追加する場合はfqn()、次のようにすることができます。

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

上記の Don の返信に +1 を付けました。

@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

将来、このバグが修正されたときにそれが可能になることを願ってます。

于 2011-08-23T12:46:44.697 に答える