2014-12-15 48 views
9

MetaClass kullanarak geçersiz kılma yöntemlerini sınamak için bu basit kodu yazmaya çalıştım. Groovy metaClass, yapıcıda çağrılan yöntemi geçersiz kıldığında başarısız olur?

kod

burada:

class Hello { 

    public Hello() 
    { 
     Foo() 
    } 

    public void Foo() 
    { 
     println "old" 
    }  

} 

Bu sadece "eski" yazdıran bir Foo() yöntemini vardır ve yapıcı çağrısı üzerine yapılacak. Ben Foo() overriden beri çıkış "yeni" olması gerektiğini bekliyordum

class HelloTest { 

    @Test 
    public void test() { 

     boolean methodFooWasCalled = false 

     Hello.metaClass.Foo = {-> println "new" 
      methodFooWasCalled = true 
     } 

     Hello hello = new Hello() 

     assertTrue methodFooWasCalled == true 

    } 
} 

:

İşte test kodu var. Ama hala "eski" basılmış. Neden başarısız olduğunu bilen var mı? Teşekkür

cevap

4

aşağıdaki çalışır:

class Hello { 
    Hello() { 
    Foo() 
    } 
} 

Hello.metaClass.Foo = {-> 
    println "new" 
} 

new Hello() 

Ve böylece şunları yapar:

class Hello { 
    Hello() { 
    invokeMethod('Foo', [] as Object[]) 
    } 

    void Foo() { println "old" } 
} 

Hello.metaClass.Foo = {-> 
    println "new" 
} 

new Hello() 

Bu seferki ilginç; Kurucuların içinde olanlar iken Foo() eser içindeki bar() çağrı, yapmaz:

class Hello { 
    Hello() { 
    Foo() 
    bar() 
    } 

    void Foo() { println "old foo"; bar() } 
    void bar() { println "old bar" } 
} 

Hello.metaClass { 
    Foo = {-> println "new foo" } 
    bar = { println "new bar" } 
} 

new Hello() 

O Groovy yapıcıları üzerinde iken İLK metaclass' yöntemleri kontrol etmez görünür. Bence bu bir hatadır ve bununla ilgili herhangi bir hata bulamadım. JIRA'u doldurmaya ne dersiniz?

+0

Evet, bir hata gibi görünüyor. Bir JIRA meselesi yaptım. Cevabınız için teşekkür ederim! – danielZ

+0

Aynı sorun var, constructor denir init() yöntemini değiştirmeye çalışıyorum. Bana JIRA sorununa işaret edebilir misiniz? Thx –

+0

https://issues.apache.org/jira/browse/GROOVY-7209 – mhsmith