2009-09-22 16 views
8

Napotkałem problem meta-programowania Groovy, którego nie mogę rozwiązać.Groovy meta-programowanie - dodawanie metod statycznych do Object.metaClass

Dodając statycznej metody foo() do klasy foobar, a następnie FooBar.foo() działa zgodnie z oczekiwaniami:

FooBar.metaClass.static.foo = { 
    println "hello" 
} 
FooBar.foo() 

Jednak zamiast dodać taką samą statycznej metody foo() do obiektu klasy , a następnie FooBar.foo() kończy się niepowodzeniem z wyjątkiem MissingMethodException:

Object.metaClass.static.foo = { 
    println "hello" 
} 
FooBar.foo() 
// groovy.lang.MissingMethodException: 
// No signature of method: FooBar.foo() is applicable for argument types: 
//() values: [] 

Dlaczego tak jest? Czy nie powinno się dodawać foo() również do FooBar?

Odpowiedz

11

Aby uzyskać zachowanie szukasz trzeba zadzwonić ExpandoMetaClass.enableGlobally()

Pamiętaj, robi to ma większy niż normalne zużycie pamięci meta-programowania.

http://groovy.codehaus.org/api/groovy/lang/ExpandoMetaClass.html#enableGlobally()

+0

Hi! Sądząc po dokumentach, powinna to być poprawna odpowiedź, ale wyjątek jest nadal generowany, nawet gdy ExpandoMetaClass.enableGlobally() jest uruchamiane na początku skryptu Groovy. Czy byłeś w stanie wprowadzić statyczną metodę do obiektu i udostępnić ją do rozszerzania obiektów? – knorv

1

I nie może wydawać się uzyskać to do pracy nawet po dodaniu ExpandoMetaClass.enableGlobally() na początku skryptu:

ExpandoMetaClass.enableGlobally(); 
Object.metaClass.static.Log = { msg -> 
    println(msg); 
} 

class Foo { 
    def l() { 
     Log("Foo:l().log"); // works 
    } 
} 

Object.Log("Object.log"); // works 
String.Log("String.log"); // works 

Log("script.log");  // works 


foo = new Foo(); 

foo.l(); 
foo.Log("foo.log"); // works 
Foo.Log("Foo.log") // Does not work 
Powiązane problemy