Перейти к основному содержимому

Представляем nudge4j

· 5 мин. чтения

1. Обзор

nudge4j позволяет разработчикам сразу увидеть влияние любой операции и предоставляет среду, в которой они могут исследовать, учиться и, в конечном счете, тратить меньше времени на отладку и повторное развертывание своего приложения.

В этой статье мы рассмотрим, что такое nudge4j , как он работает и какую пользу он может извлечь из разрабатываемого Java-приложения.

2. Как работает nudge4j

2.1. REPL в маскировке

nudge4j — это, по сути, цикл чтения-оценки-печати (REPL), в котором вы общаетесь со своим Java-приложением в окне браузера через простую страницу, содержащую всего два элемента:

  • редактор
  • кнопка Выполнить на JVM

./c9487e0d858236bc3a15eb170af0be28.png

Вы можете общаться со своей JVM в типичном цикле REPL:

  • Введите любой код в редактор и нажмите Execute на JVM .
  • Браузер отправляет код на вашу JVM, которая затем запускает код
  • Результат возвращается (в виде строки) и отображается под кнопкой

nudge4j поставляется с несколькими примерами, которые можно попробовать сразу, например, узнать, как долго работает JVM и сколько памяти доступно в настоящее время. Я предлагаю вам начать с них, прежде чем писать собственный код.

2.2. Движок JavaScript

Код, отправляемый браузером в JVM, представляет собой JavaScript, управляющий объектами Java (не путать с любым JavaScript, работающим в браузере). JavaScript выполняется встроенным движком JavaScript Nashorn .

Не беспокойтесь, если вы не знаете (или не любите) JavaScript — для ваших нужд nudge4j вы можете просто думать о нем как о нетипизированном диалекте Java.

Обратите внимание: я знаю, что сказать, что «JavaScript — это нетипизированная Java» , — это огромное упрощение. Но я хочу, чтобы Java-разработчики (которые могут иметь предубеждение ко всему, что относится к JavaScript) дали nudge4j шанс.

2.3. Объем взаимодействия JVM

nudge4j позволяет вам получить доступ к любому классу Java, который доступен из вашей JVM , позволяя вам вызывать методы, создавать объекты и т. д. Это очень мощно, но этого может быть недостаточно при работе с вашим приложением.

В некоторых ситуациях вам может понадобиться получить доступ к одному или нескольким объектам, характерным только для вашего приложения, чтобы вы могли манипулировать ими. nudge4j позволяет это сделать. Любой объект, который необходимо показать, может быть передан в качестве аргумента во время создания экземпляра.

2.4. Обработка исключений

Дизайн nudge4j учитывает возможность того, что пользователи инструмента могут совершать ошибки или вызывать ошибки в JVM. В обоих этих случаях инструмент предназначен для создания отчета о полной трассировке стека, чтобы помочь пользователю исправить ошибку или ошибку.

Давайте посмотрим на снимок экрана, на котором фрагмент кода, который был выполнен, приводит к возникновению исключения:

./0947839124dcee8dcc65402e78d08ca1.png

3. Добавление nudge4j в ваше приложение

3.1. Просто скопируйте и вставьте

Интеграция с nudge4j достигается несколько нетрадиционно, поскольку нет файлов jar , которые можно добавить в путь к классам, и нет зависимостей, которые можно добавить в сборку Maven или Gradle.

Вместо этого вам нужно просто скопировать и вставить небольшой фрагмент кода Java — около 100 строк — в любое место вашего собственного кода перед его запуском.

Вы найдете фрагмент на домашней странице nudge4j — на странице даже есть кнопка, которую вы можете нажать, чтобы скопировать фрагмент в буфер обмена.

Поначалу этот фрагмент кода может показаться довольно запутанным. Тому есть несколько причин:

  • Фрагмент nudge4j можно добавить в любой класс; поэтому он не мог делать никаких предположений относительно import s, и любой содержащийся в нем класс должен был быть полностью определен .
  • Чтобы избежать потенциальных конфликтов с уже определенными переменными, код заключен в функцию.
  • Доступ к встроенному JDK HttpServer осуществляется путем самоанализа, чтобы избежать ограничений, существующих в некоторых IDE (например, Eclipse) для пакетов, начинающихся с «com.sun.*».

Таким образом, хотя Java уже является многословным языком, его нужно было сделать еще более многословным, чтобы обеспечить бесшовную интеграцию.

3.2. Образец заявления

Давайте начнем со стандартного JVM-приложения, где мы притворимся, что простой java.util.HashMap содержит большую часть информации, с которой мы хотим работать:

public class MyApp {
public static void main(String args[]) {
Map map = new HashMap();
map.put("health", 60);
map.put("strength", 4);
map.put("tools", Arrays.asList("hammer"));
map.put("places", Arrays.asList("savannah","tundra"));
map.put("location-x", -42 );
map.put("location-y", 32);

// paste original code from nudge4j below
(new java.util.function.Consumer<Object[]>() {
public void accept(Object args[]) {
...
...
}
}).accept(new Object[] {
5050, // <-- the port
map // <-- the map is passed as a parameter.
});
}
}

Как видно из этого примера, вы просто вставляете фрагмент nudge4j в конец своего кода. Строки 12-20 в этом примере служат заполнителем для сокращенной версии фрагмента.

Теперь давайте укажем браузеру на http://localhost:5050/. Карта теперь доступна как args[1] в редакторе из браузера, просто набрав:

args[1];

Это предоставит сводку нашей карты (в данном случае опираясь на метод toString () карты и его ключи и значения).

Предположим, мы хотим проверить и изменить запись Map со значением ключа «tools» .

Чтобы получить список всех доступных инструментов на карте , вы должны написать:

map = args[1];
map.get("tools");

И чтобы добавить новый инструмент на карту , вы должны написать:

map = args[1];
map.get("tools").add("axe");

Как правило, нескольких строк кода должно быть достаточно для проверки любого Java-приложения.

4. Вывод

Объединив два простых API в JDK ( сервер Nashorn и Http ) , nudge4j дает вам возможность исследовать любое приложение Java 8.

В некотором смысле nudge4j — это просто современный вариант старой идеи: предоставить разработчикам доступ к возможностям существующей системы через язык сценариев — идея, которая может повлиять на то, как Java-разработчики могут проводить свой день за программированием.