nudge4jの紹介

nudge4jの紹介

1. 概要

nudge4jを使用すると、開発者は操作の影響をすぐに確認でき、アプリケーションのデバッグと再デプロイに費やす時間を短縮して、探索、学習できる環境を提供します。

この記事では、nudge4jとは何か、どのように機能するか、開発中のJavaアプリケーションがどのように恩恵を受けるかについて説明します。

2. nudge4jのしくみ

2.1. 変装したREPL

nudge4jは本質的にread-eval-print-loop(REPL)であり、2つの要素のみを含む単純なページを介してtalk to your Java application within a browser windowを実行します。

  • 編集者

  • Execute on JVMボタン

image

典型的なREPLサイクルでJVMと話すことができます:

  • エディターに任意のコードを入力し、Execute on JVMを押します

  • ブラウザがコードをJVMに投稿し、JVMがコードを実行します

  • 結果が(文字列として)返され、ボタンの下に表示されます

nudge4jには、JVMの実行時間や現在使用可能なメモリの量を照会するなど、すぐに試すことができるいくつかの例が付属しています。 独自のコードを書く前に、これらから始めることをお勧めします。

2.2. JavaScriptエンジン

ブラウザーからJVMに送信されるコードは、Javaオブジェクトを操作するJavaScriptです(ブラウザーで実行されるJavaScriptと混同しないでください)。 JavaScriptは、組み込みのJavaScriptエンジンNashornによって実行されます。

JavaScriptがわからない(または好きではない)場合でも心配する必要はありません。nudge4jのニーズについては、タイプされていないJava方言と考えることができます。

“JavaScript is untyped Java”と言うのは非常に単純化されていることに注意してください。 しかし、私はJava開発者(JavaScriptであるものに偏見を持っているかもしれない)にnudge4jにかなりのチャンスを与えてほしい。

2.3. JVM相互作用の範囲

nudge4jを使用すると、access any Java class which is accessible from your JVMを使用して、メソッドの呼び出し、オブジェクトの作成などを行うことができます。 これは非常に強力ですが、アプリケーションを操作している間は十分ではない場合があります。

状況によっては、アプリケーションのみに固有の1つ以上のオブジェクトにアクセスして、それらを操作できるようにする必要があります。 nudge4jはそれを可能にします。 公開する必要があるオブジェクトは、インスタンス化時に引数として渡すことができます。

2.4. 例外処理

nudge4jの設計は、ツールのユーザーがJVMでミスをしたり、エラーを引き起こしたりする可能性を認識しています。 これらの両方のケースで、ツールは、ユーザーが間違いやエラーを修正するように導くために、完全なスタックトレースを報告するように設計されています。

実行されたコードのスニペットによって例外がスローされるスクリーンショットを見てみましょう。

image

3. アプリケーションにnudge4jを追加する

3.1. コピーして貼り付けるだけ

クラスパスに追加するjarファイルがなく、MavenまたはGradleビルドに追加する依存関係がないため、nudge4jとの統合はやや型破りに行われます。

代わりに、実行する前に、simply copy and paste a small snippet of Java code(約100行)を独自のコードのどこかに配置する必要があります。

スニペットはnudge4j home pageにあります。ページには、クリックしてスニペットをクリップボードにコピーできるボタンもあります。

このコードスニペットは、最初は非常に厄介に見えるかもしれません。 その理由はいくつかあります。

  • nudge4jスニペットは任意のクラスにドロップできます。したがって、importsに関して仮定を行うことはできず、含まれるクラスは完全修飾されている必要がありました。

  • 既に定義されている変数との潜在的な衝突を避けるために、コードは関数でラップされています

  • 組み込みのJDK HttpServerへのアクセスは、一部のIDEに存在する制限を回避するために、イントロスペクションを介して行われます(例: Eclipse)“com.sun.*”で始まるパッケージの場合

そのため、Javaはすでに冗長言語ですが、シームレスな統合を実現するには、さらに冗長にする必要がありました。

3.2. サンプルアプリケーション

単純なjava.util.HashMapが、操作したい情報のほとんどを保持していると仮定して、標準のJVMアプリケーションから始めましょう。

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.
        });
    }
}

この例からわかるように、独自のコードの最後にnudge4jスニペットを貼り付けるだけです。 この例の12〜20行目は、スニペットの短縮バージョンのプレースホルダーとして機能します。

次に、ブラウザでhttp://localhost:5050/.を指定します。これで、次のように入力するだけで、ブラウザからエディタでargs[1]としてマップにアクセスできます。

args[1];

これにより、Mapの概要が提供されます(この場合、MaptoString()メソッドとそのキーおよび値に依存します)。

キー値“tools”を使用してMapエントリを調べて変更するとします。

Mapで使用可能なすべてのtoolsのリストを取得するには、次のように記述します。

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

そして、新しいtoolMapに追加するには、次のように記述します。

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

一般に、Javaアプリケーションをプローブするには、数行のコードで十分です。

4. 結論

JDK内の2つの単純なAPI(NashornおよびHttp servernudge4jを組み合わせることにより、任意のJava8アプリケーションをプローブする機能が提供されます。

ある意味で、nudge4jは古いアイデアを現代的に切り取ったものです。つまり、開発者がスクリプト言語を介して既存のシステムの機能にアクセスできるようにします。これは、Java開発者が1日のコーディングにどのように費やすかに影響を与える可能性があるアイデアです。 。