Groovy: Про коня и лань 2

Недавно я писал о том, как интегрировать код, написанный на стандартной Java и на JavaFX. Сегодня речь пойдет о совмещении программ на Java с другим дружественным синтаксисом —


Рецепт интеграции Java и Groovy программ я нашел в уже неоднократно упоминавшейся Библии Groovy-программистов — книге "Groovy in action" (см. главу 11).

Зачем вообще эта интеграция нужна? Программы на Groovy пишутся в разы быстрее, выглядят компактнее, проще правятся, не нуждаются в компиляции. Это всё та же Java, только «обезжиренная». Groovy-скрипты при исполнении преобразуются в Java байт-код и исполняются в среде обычной Java-машины, т.е. не нужны какие-то особые нативные библиотеки. Groovy-скрипт можно откомпилировать в обычный Java-класс, который ничем не будет отличаться от миллиардов своих собратьев.

Первый способ интеграции — через объект GroovyShell:


GroovyShell = new GroovyShell();
Object result = shell.evaluate("12 + 23");
System.out.println(result); // Выведется число 35


В качестве параметра методу evaluate() можно передавать гораздо более длинный текст, чем приведен в примере. Кроме того, скрипт можно заранее записать в файл и также передавать его методу evaluate(). Можно также считывать скрипт из потока.

Интегрировать Groovy в Java можно также с помощью специального класса GroovyClassLoader:

GroovyClassLoader gcl = new GroovyClassLoader;
Class helloClass = gcl.parseClass("Hello.groovy");  
GroovyObject helloObj = (GroovyObject) helloClass.newInstance();
System.out.println(helloObj.invokeMethod("hello", new Object[]{}));


Java-программисты легко рассмотрят здесь стандартные способы работы с классами и объектами посредством концепции Reflection.

И все-таки получается странная вещь: чтобы достучаться из Java-программы до изящных конструкций Groovy приходится городить громоздкие строчки. Однако цель оправдывает средства, особенно если задействовать такое могучее средство наследования Java, как интерфейсы. Об этом — в следующий раз.
  • +1
  • 14 июня 2010, 11:43
  • yababay

Комментарии (4)

RSS свернуть / развернуть
+
0
А есть ли способ как-то просто использовать Groovy для разных прозаических вещей вроде пропарсить файл, вызвать команды shell и тп?

Я имею ввиду что простое руководство как воспользоваться всем этим?
avatar

Gangsta

  • 14 июня 2010, 12:44
+
0
Ну, например, вот скрипт для построкового поиска в текстовом файле (ищет строки, содержащие знак @):

#!/usr/bin/groovy

new File("withEmail.txt").eachLine{
 if(it =~ /.*@.*/) println "$it: эта строка содержит e-mail"
}


Здесь

it — универсальное для Groovy имя переменной, обрабатываемой внутри блока, называемого Closure.
=~ — знак, проверяющий на соответствия переменной регулярному выражению. Оно заключено в слэши. В нормальной Java для такой проверки потребовалось бы строки 3-4, причем весьма заковыристых, с кучей импортов.
$it — переменная, включенная внутрь строки. В Java

println "$it: эта строка содержит e-mail"


выглядело бы как

System.out.println(it + ": эта строка содержит e-mail");
avatar

yababay

  • 14 июня 2010, 22:15
+
0
Все относительно.
Примерно такое-же соотношение строк в программах на «С++» и
«CAMBASIC» в «Octagon 6ххх», но применение все-равно зависит от конечной
задачи…
Больше языков — хороших и разных !
avatar

Markony

  • 15 июня 2010, 09:34
+
0
Да уж, на Groovy систему реального времени не напишешь. А вот на Java можно. Поэтому и нужна интеграция. Там, где время исполнения не критично, например при регистрации нового пользователя в online-системе, такие языки, как Groovy — самое оно. Там же, где счет идет на миллисекунды, приходится брать в руки инструмент позабористей, может быть даже C или Asm.
avatar

yababay

  • 15 июня 2010, 11:16

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.