Wykonywanie kodu JavaScript w Javie

ausmalbild-nashorn-7Wraz z pojawieniem się Javy 8 został udostępniony nowy silnik JavaScriptowy dla JVM o nazwie Nashorn. Zastąpił on starszą implementację Rhino, dostępnego od Javy 6. JavaScriptowy silnik Rhino został stworzony dawno temu przez firmę Netscape (chyba w 1997 roku), a w późniejszym czasie rozwijany był przez Mozillę. Nashorn to silnik pozwalający uruchamiać kod Javascriptowy po stronie serwera. Daje to duże możliwości, bo w łatwy sposób można udostępnić „język / składnie” jakiejś konfiguracji dla użytkownika, dzięki czemu w trakcie działania aplikacji można modyfikować implementację pewnych zachowań i dodawać nowe. Dzięki wykorzystaniu takiego silnika można np. dać użytkownikowi możliwość oprogramowania jakiegoś fragmentu systemu.
Wykorzystując taki silnik można zaimplementować np. walidację formularzy przechowując ją tylko w jednym miejscu systemu / modelu. Z formularza przekazujemy JSONa, po stronie serwera wykonujemy ten sam kod który był wykonany po stronie przeglądarki.

Bez zbędnego wstępu, przejdę do konkretnych przykładów pokazujących możliwości wywoływania kodu JavaScript z poziomu Javy.

Przykład Hello World:

W wyniku uruchomienia czego, na konsoli pojawi się tekst: „Cześć, tu Notatnik Programisty!”

Interfejs ScriptEngine posiada przeciążoną metodę eval przyjmującą obiekt klasy Reader, dzięki czemu można wywołać kod bezpośrednio z zewnętrznego pliku:

W Javie 7 metoda getEngineByName(„js”) zwróci implementację Rhino. Od wersji ósmej będzie to już silnik Nashorn.

Wywoływanie funkcji:

Przekazywanie parametrów:

Wywoływanie kodu Javy z poziomu JavaScript:

Przykład klasy z publiczną metodą statyczną:

W pliku js wywołujemy ją następująco:

Po wywołaniu engine.eval(scriptReader) z poziomu Javy, na konsoli wyświetli się: „Hello Notatnik Programisty”.

Konwersja typów

Implementacja interfejsów z poziomu JavaScript:

W powyższym kodzie implementowany jest interfejs Runnable, przekazywany do obiektu Thread. Tekst „Metoda run w oddzielnym wątku” zostanie wyświetlony na oucie w nowym wątku.

Przekazywanie obiektów (binding)

Definicja klasy z dostępnymi metodami.

Jedna z nich jest statyczna.

Jednak wywołanie tego kodu spowoduje wyrzucenie wyjątku:

Wywoływanie metod statycznych można wykonać tak:

Przykład najbanalniejszego zastosowania?

Np. chcemy aby w aplikacji użytkownik mógł definiować pewne warunki logiczne, dzięki którym coś się będzie wykonywało, czy wyświetlało. Włącznie z wykorzystaniem operatorów && || i nawiasów grupujących.
Przykład takiego wyrażenia:
„(EDYCJA || USUNIECIE) && !BRAK.DOSTEPU”, które po zastąpieniu zmiennymi logicznymi po stronie serwera zostanie zaktualizowane na „(true||false) && true” i wywołane przez silnik JSowy (jako prosty parser wyrażeń logicznych) zwróci:

Jako ciekawostkę dodam, że gdy chodzi o parsowanie samych wyrażeń logicznych, to np. dedykowana do tego, choć już leciwa biblioteka http://jboolexpr.sourceforge.net/ zadziała w tym przypadku ok. 50 razy szybciej. Jednak nikt nie powiedział, że w tym przypadku zamiast wyrazu EDYCJA nie mogłoby być inne wyrażenie np. $api.editRights(4), co zmienia już postać rzeczy.

Problemem jest wydajność, jednak przy odpowiedniej ilości iteracji kodu Javowy Just In Time (JIT) compiler zacznie działać i wykona sporą optymalizację. Mimo wszystko, Node.js i tak będzie dwa razy szybszy.

nashorn_vs_java_numbers-o

Źródło: http://pieroxy.net/blog/2015/06/29/node_js_vs_java_nashorn.html

To również może Cię zainteresować:

  • Fundamenty języka JavaFundamenty języka Java Niecały miesiąc temu zostałem poproszony przez Strefę Kursów o ocenę ich nowo wydanego materiału dla osób chcących zacząć naukę programowania w Javie: "Fundamenty języka Java". Przerobiłem […]
  • Java JNA #2, Total CommanderJava JNA #2, Total Commander W poprzednim wpisie zrobiłem krótkie wprowadzenie do wykorzystywania biblioteki user32.dll przez Javę do pobierania informacji z innych aplikacji okienkowych. Poniżej rozszerzymy nasze […]
  • Java JNA, user32.dll – przechwytujemy aplikacje okienkoweJava JNA, user32.dll – przechwytujemy aplikacje okienkowe Zdarzają się takie sytuacje, że chcielibyśmy naszym programem sterować inną aplikacją okienkową. W tym artykule wprowadzę was w temat pobierania danych z programów windowsowych za pomocą […]
  • Java Spring MVC, recenzja kursu wideo z Videopoint.plJava Spring MVC, recenzja kursu wideo z Videopoint.pl Pół roku temu opisywałem kurs z podstaw frameworka Spring dostępnego w Videopoint.pl, a dziś co nieco o kolejnym z tej serii: Spring Web MVC. Autorem obu ponad 3-godzinnych materiałów jest […]
  • Mapowanie XML obiektów Java – JAXBMapowanie XML obiektów Java – JAXB Podczas tworzenia oprogramowania na każdym kroku mamy kontakt z danymi w formacie XML. Opiszę tutaj jeden ze sposobów konwersji danych w obie strony Java <-> XML. Ale na […]
  • Java i listing wszystkich plików w kataloguJava i listing wszystkich plików w katalogu W ostatnim czasie musiałem przerobić jeden z systemów na wersję wielojęzykową. Chodziło dokładnie o to, aby wszystkie Stringi zostały wywołane przez tzw. wrapper ze wstrzyknięciem pewnego […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *