Apresentando o nudge4j

Apresentando o nudge4j

1. Visão geral

nudge4j permite que os desenvolvedores vejam o impacto de qualquer operação imediatamente e fornece um ambiente no qual eles podem explorar, aprender e, por fim, gastar menos tempo depurando e reimplantando seu aplicativo.

Neste artigo, exploraremos o que énudge4j, como funciona e como qualquer aplicativo Java em desenvolvimento pode se beneficiar dele.

2. Comonudge4j funciona

2.1. Um REPL disfarçado

nudge4j é essencialmente um loop de leitura-avaliação-impressão (REPL) no qual vocêtalk to your Java application within a browser window por meio de uma página simples contendo apenas dois elementos:

  • um editor

  • o botãoExecute on JVM

image

Você pode conversar com sua JVM em um ciclo REPL típico:

  • Digite qualquer código no editor e pressioneExecute on JVM

  • O navegador publica o código na sua JVM, que executa o código

  • O resultado é retornado (como uma string) e exibido abaixo do botão

nudge4j vem com alguns exemplos para tentar imediatamente, como consultar há quanto tempo o JVM está em execução e quanta memória está disponível no momento. Eu sugiro que você comece com isso antes de escrever seu próprio código.

2.2. O motor JavaScript

O código enviado pelo navegador para a JVM é o JavaScript que manipula objetos Java (não deve ser confundido com nenhum JavaScript que é executado no navegador). O JavaScript é executado pelo mecanismo interno de JavaScriptNashorn.

Não se preocupe se você não conhece (ou gosta) de JavaScript - para suas necessidades denudge4j, você pode apenas pensar nele como um dialeto Java sem tipo.

Observe que estou ciente de que dizer que“JavaScript is untyped Java” é uma grande simplificação. Mas eu quero que os desenvolvedores Java (que podem ter preconceito em relação a qualquer coisa que seja JavaScript) dêem anudge4j uma chance justa.

2.3. Escopo da interação JVM

nudge4j permiteaccess any Java class which is accessible from your JVM, permitindo chamar métodos, criar objetos, etc. Isso é muito poderoso, mas pode não ser suficiente ao trabalhar com seu aplicativo.

Em algumas situações, convém alcançar um ou mais objetos, específicos apenas ao seu aplicativo, para poder manipulá-los. nudge4j permite isso. Qualquer objeto que precise ser exposto pode ser passado como argumento no momento da instanciação.

2.4. Manipulação de exceção

O design denudge4j reconhece a possibilidade de que os usuários da ferramenta possam cometer erros ou causar erros na JVM. Nos dois casos, a ferramenta foi projetada para relatar o rastreamento completo da pilha para orientar o usuário a corrigir o erro ou erro.

Vejamos uma captura de tela na qual um snippet de código que foi executado resulta em uma exceção sendo lançada:

image

3. Adicionandonudge4j ao seu aplicativo

3.1. Basta copiar e colar

A integração comnudge4j é obtida de forma não convencional, pois não há arquivosjar para adicionar ao seu classpath e não há dependências para adicionar a uma compilação Maven ou Gradle.

Em vez disso, você devesimply copy and paste a small snippet of Java code - cerca de 100 linhas - em qualquer lugar em seu próprio código antes de executá-lo.

Você encontrará o snippet emnudge4j home page - há até um botão na página em que você pode clicar para copiar o snippet para a área de transferência.

Esse trecho de código pode parecer bastante obscuro no começo. Existem algumas razões para isso:

  • O snippetnudge4j pode ser descartado em qualquer classe; portanto, não foi possível fazer nenhuma suposição em relação aoimports, e qualquer classe nele contida tinha que ser totalmente qualificada

  • Para evitar possíveis conflitos com variáveis ​​já definidas, o código é envolvido em uma função

  • O acesso ao JDK HttpServer interno é feito via introspecção para evitar restrições que existem com alguns IDEs (por exemplo, Eclipse) para pacotes começando com“com.sun.*”

Portanto, mesmo que o Java já seja uma linguagem detalhada, ele teve que ser ainda mais detalhado para fornecer uma integração perfeita.

3.2. Aplicação de amostra

Vamos começar com um aplicativo JVM padrão onde fingimos que um simplesjava.util.HashMap contém a maior parte das informações com as quais queremos brincar:

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() {
            public void accept(Object args[]) {
                ...
                ...
            }
        }).accept(new Object[] {
            5050,  // <-- the port
            map    // <-- the map is passed as a parameter.
        });
    }
}

Como você pode ver neste exemplo, basta colar o snippetnudge4j no final do seu próprio código. As linhas 12 a 20 do exemplo aqui servem como um espaço reservado para uma versão abreviada do snippet.

Agora, vamos apontar o navegador parahttp://localhost:5050/. O mapa agora está acessível comoargs[1] no editor do navegador simplesmente digitando:

args[1];

Isso fornecerá um resumo de nossosMap (neste caso, contando com o métodotoString() deMap e suas chaves e valores).

Suponha que desejamos examinar e modificar a entradaMap com o valor-chave“tools”.

Para obter uma lista de todos ostools disponíveis emMap, você escreveria:

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

E para adicionar um novotool aoMap, você escreveria:

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

Em geral, poucas linhas de código devem ser suficientes para analisar qualquer aplicativo Java.

4. Conclusão

Ao combinar duas APIs simples dentro do JDK (NashorneHttp server)nudge4j, você pode sondar qualquer aplicativo Java 8.

De certa forma,nudge4j é apenas um corte moderno de uma velha ideia: dar aos desenvolvedores acesso às instalações de um sistema existente por meio de uma linguagem de script - uma ideia que pode ter um impacto em como os desenvolvedores Java poderiam passar o dia codificando .