2016-08-25 9 views
4

私はGroovy MetaClassで何か変わった動作をしたことに気付きました。誰かが私にここで何が起こっているのかを知らせることができるのだろうかと思います。groovy invokeMethodメタクラスにメソッドを追加する必要がありますif文?

これは正常に動作します:

ここ
@Override 
Object invokeMethod(String name, Object args) { 
    println("Should only see this once") 
    def impl = { Object theArgs -> println("Firing WeirdAction") } 
    getMetaClass()."$name" = impl 
    return impl(args) 
} 

は私のクラスのインスタンスだと呼んで、クラスは上記以外の空である。しかし

@Override 
Object invokeMethod(String name, Object args) { 
    if(true) { 
     println("Should only see this once") 
     def impl = { Object theArgs -> println("Firing WeirdAction") } 
     getMetaClass()."$name" = impl 
     return impl(args) 
    } 
} 

私は離陸場合、それはMissingPropertyExceptionをスローif文メソッド定義。

IfTester sut = new IfTester() 
sut.WeirdAction() 

誰かが私がここで誤解していることを知っていますか?

答えて

1

Groovy 2.4.5を使用すると、IfTester.getMetaClass()に対してgetMetaClass()に関連するように見えます。考えてみましょう:

その後、 if(true)
class IfTester { 

    @Override 
    Object invokeMethod(String name, Object args) { 
     if (true) { 
     println "Should only see this once" 
     def impl = { def theArgs -> println "Firing WeirdAction" } 
     def mc1 = getMetaClass() 
     println "mc1: " + mc1 
     println "----" 
     def mc2 = IfTester.getMetaClass() 
     println "mc2: " + mc2 
     IfTester.getMetaClass()."$name" = impl 
     return impl(args) 
     } 
    } 
} 

IfTester sut = new IfTester() 
sut.WeirdAction() 

mc1mc2同一であり、両方の仕事を。 ifがなければ、mc1は異なるので、そのスタイルを使用するとエラーが発生します。

私は根本的な原因を知りませんし、バグでもありません。どういうわけか、スコープの問題があるか、その意味でthisの感覚が違うようです。

+0

例を実行して、クラス呼び出しとインスタンス呼び出しの間に異なるリターンがあることに気がついたら、もう一度グーグルで検索し、同様のスレッドを見つけました。https://stackoverflow.com/questions/34449587/groovy-this-metaclass-versus-instance-メタクラス。スコープがコールをインスタンスからクラスに変更しているのは私にとっては奇妙ですが、この時点では完全には得られないかもしれません。 – gt124

関連する問題