1

使用できる方法を書きましたClassName.methodName(args)

どうすれば使えるようになるのでしょうかmethodName(args)

私はサルのようにオブジェクトにパッチを当ててみました:

class Object {
    def methodName(args) {
        // method definition
    }
}

アップデート:

私はdmahapatroが言ったことを試しました。

import static groovy.json.JsonOutput.*

Object.metaClass.outputJson = {
    return println(prettyPrint(toJson(it)))
}

outputJson([:])

戻る:

Caught: groovy.lang.MissingMethodException: No signature of method: Object.outputJson() is applicable for argument types: (java.util.LinkedHashMap) values: [[:]]
Possible solutions: outputJson(), outputJson(java.lang.Object)
groovy.lang.MissingMethodException: No signature of method: Object.outputJson() is applicable for argument types: (java.util.LinkedHashMap) values: [[:]]
Possible solutions: outputJson(), outputJson(java.lang.Object)
    at Object.run(Object.groovy:7)
[Finished in 2.1s]

編集によって作成された問題は、Object.groovy が Groovy の Object.java と競合したためです。名前を ObjectMeta (または他の競合しない名前に変更すると、機能しました)。

4

2 に答える 2

1

使用ExpandoMetaClassするObject

Object.metaClass.printsHello = {
    return it
}

assert "Hello" == printsHello("Hello")
assert "Hello" == 'ABC'.printsHello("Hello")
assert "Hello" == 123.printsHello("Hello")
assert "Hello" == new Object().printsHello("Hello")

class A{
    Integer a
}

assert "Hello" == new A(a: 10).printsHello("Hello")

@Categoryこれは、以下のように使用して達成することもできます

@Category(Object) class CustomizedObject{
    def printsHello(String str){
        return str
    }
}

String.mixin CustomizedObject
assert 'Hello' == 'ABC'.printsHello('Hello')

Integer.mixin CustomizedObject
assert 'Hello' == 123.printsHello('Hello')

BigInteger.mixin CustomizedObject
assert 'Hello' == 123G.printsHello('Hello')

@Mixin(CustomizedObject) //Compile Time Mixin
class A{
}

assert 'Hello' == new A().printsHello('Hello')

jar で配布する場合@Categoryは、その jar に含めCustomizedObjectて、必要な場所で使用します。

import static groovy.json.JsonOutput.*

Object.metaClass.outputJson = {
    return prettyPrint(toJson(it))
}

println outputJson([a: 1, b: 2, c: 3])

//Prints:
{
    "a": 1,
    "b": 2,
    "c": 3
}

注:-
ここでキャッチすべきことの 1 つは、metaClasson をObject直接使用していることです。これは、重要な場合がありますmetaClass。操作が完了したら、from オブジェクトをクリアする必要があります。

于 2013-06-17T19:05:12.000 に答える