1. 概要

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

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

2. nudge4jの仕組み

2.1. 変装したREPL

nudge4j は、基本的にread-eval-print-loop(REPL)であり、2つの要素のみを含む単純なページを介してブラウザウィンドウ内でJavaアプリケーションと通信します。

  • 編集者
  • JVMで実行ボタン

通常のREPLサイクルでJVMと通信できます。

  • エディターに任意のコードを入力し、JVMで実行を押します。
  • ブラウザはコードをJVMに送信し、JVMがコードを実行します
  • 結果は(文字列として)返され、ボタンの下に表示されます

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

2.2. JavaScriptエンジン

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

Javaスクリプトがわからない(または好きではない)場合でも心配しないでください。 nudge4j のニーズについては、タイプされていないJava方言と考えることができます。

「JavaScriptは型指定されていないJava」と言うのは非常に単純化されていることに注意してください。 しかし、私はJava開発者(JavaScriptであるものすべてに偏見を持っている可能性があります)にnudge4jにかなりのチャンスを与えてほしいと思っています。

2.3. JVMの相互作用の範囲

nudge4j を使用すると、JVM からアクセス可能な任意のJavaクラスにアクセスして、メソッドの呼び出しやオブジェクトの作成などを行うことができます。 これは非常に強力ですが、アプリケーションでの作業では不十分な場合があります。

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

2.4. 例外処理

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

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

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

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

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

代わりに、実行する前に、Javaコードの小さなスニペット(約100行)をコピーして自分のコードのどこかに貼り付ける必要があります。

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

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

  • nudge4jスニペットは任意のクラスにドロップできます。 したがって、 import に関しては何も想定できず、含まれるクラスは完全に修飾されている必要がありました。
  • すでに定義されている変数との潜在的な衝突を回避するために、コードは関数でラップされます
  • 組み込みのJDKHttpServerへのアクセスは、一部のIDEに存在する制限を回避するために、イントロスペクションを介して行われます(例: Eclipse)“ com.sun。*”で始まるパッケージの場合

そのため、Javaはすでに冗長な言語ですが、シームレスな統合を実現するには、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<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];

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

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

マップで利用可能なすべてのツールのリストを取得するには、次のように記述します。

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

そして、新しいツールマップに追加するには、次のように記述します。

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

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

4. 結論

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

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