Po raz kolejny podwójna dawka wiedzy na podstawie książki Programming Groovy: Dynamic Productivity for the Java Developer. Na początek integracja kodu groovy z kodem java. Tak jak przypuszczałem podczas czytania powyższej książki sprawa jest prosta.
Są 2 opcje uruchomienia kodu groovy:
1.Przez polecenie groovy (automatyczne kompilowanie kodu w pamięci i wykonanie go).
2.Kompilacja przez groovyc i uruchomienie przez polecenie java (należy pamiętać o dodaniu biblioteki groovy do classpatha).
Zazwyczaj skrypty groovy nie są w żadnym pakiecie.
Nie ma różnicy między skompilowanym kodem groovy a java. Użycie klas groovy nie różni się niczym od użycia klas javowych. Jeśli klasy są skompilowane lub w jarze to ich użycie jest normalne (tak jak w javie).
Jeśli kod groovy jest skompilowany lub jarem od razu zadziała z kodem javowym. Jeśli to jest źródło należy użyć groovyc. Javac rozpoznaje wszystkie klasy od których zależy dana klasa i je kompiluje, ale nie rozpoznaje plików z rozszerzeniem groovy. Groovyc to potrafi i dla każdego pliku groovy potrafi skompilować pliki java, należy używać z flagą -j. (joint compilation – kompilacja łączona).
Jeśli wywoływany jest skrypt groovy w klasie groovy to należy użyć:
shell = new GroovyShell()
shell.evaluate(new File('Script1.groovy' ))
lub wersja skrócona
evaluate(new File('Script1.groovy' ))
Wywołanie skryptu groovy z poziomu javy odbywa się na podstawie JSR 223. Inne języki bardziej to wspierają niż groovy z powodu joint compilation, np:
import javax.script.*;
public class CallingScript{
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy" );
System.out.println("Calling script from Java" );
try{
engine.eval("println 'Hello from Groovy'" );
}
catch(ScriptException ex){
System.out.println(ex);
}
}
}
Metaprogramowanie
Aby w pełni poznać plusy metaprogramowania w groovy należy zrozumieć obiekty w groovy i manipulowanie na metodach.
Obiekty groovy są co najmniej jak obiekty java ale posiadają więcej funkcji. Obiekty groovy mają bardziej dynamiczne zachowanie niż obiekty java, wywoływanie i operacje na metodach odbywają się w inny sposób niż w obiektach java.
W aplikacjach groovy pracuje się na 3 rodzajach obiektów:
-POJO – klasy javove
-POGO – klasy napisane w groovy rozszerzające java.lang.Object i implementujące groovy.lang.GroovyObject
-interceptory groovy – rozszerzające GroovyInterceptable
Dzięki metodom invokeMethod( ), getProperty( ), and setProperty( ) groovy jest dynamiczny.
Wszystkie interceptory i metody zdefiniowane w MetaClass klasy są ważniejsze niż oryginalne metody w POJO.
hasProperty() sprawdza czy istnieje właściwość.
respondsTo() sprawdza czy istnieje metoda.
Można wywołać metodę bez znania jej nazwy w trakcie pisani(dynamizm):
str = "hello"
methodName = 'toUpperCase'
// Name may come from an input instead of being hard coded
methodOfInterest = str.metaClass.getMetaMethod(methodName)
println methodOfInterest.invoke(str)
Dynamiczne wywołanie właściwości odbywa się w następujący sposób
obj[property]
lub
obj."$usrRequestedProperty"
a metody
obj."$usrRequestedMethod" ()
lub
obj.invokeMethod(usrRequestedMethod, null)
gdzie null to lista argumentów.
Dodaj do ulubionych:
Bądź pierwszą osobą, która doda ten wpis do listy ulubionych.