1概要

__https://lorenzoongithub.github.io/nudge4j/[nudge4j]は、開発者があらゆる操作の影響をすぐに確認できるようにし、開発者が自分のアプリケーションのデバッグや再デプロイに費やす時間を節約できる環境を提供します。 。

この記事では、

nudge4j

とは何か、それがどのように動作するのか、そして開発中のJavaアプリケーションがそれからどのように利益を得るのかを探ります。


2

nudge4j

のしくみ


2.1. 変装したREPL


nudge4j

は基本的にread-eval-print-loop(REPL)で、ブラウザウィンドウ内でJavaアプリケーションと対話するのは、2つの要素だけを含む単純なページを介して行われます。

  • 編集者

  • [JVMで実行]ボタン

リンク:/uploads/nudge4j.in__.action.499×439-300×264.png%20300w[]

典型的なREPLサイクルであなたのJVMと対話することができます。

  • エディタに任意のコードを入力して、[JVMで実行]を押します。

  • ブラウザがあなたのJVMにコードをポストし、JVMがそれを実行します。

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


nudge4j

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


2.2. JavaScriptエンジン

ブラウザからJVMに送信されるコードは、Javaオブジェクトを操作するJavaScriptです(ブラウザ上で実行されるJavaScriptと混同しないでください)。 JavaScriptは内蔵のJavaScriptエンジンhttp://openjdk.java.net/projects/nashorn/[

Nashorn

]によって実行されます。

あなたがJavaScriptを知らない(または好きでない)かどうか心配しないでください – あなたの

nudge4j

ニーズのために、あなたはただタイプなしJava方言として考えることができます。

私は、「JavaScriptは型なしJava」と言うのが非常に単純化されていることに気づいていることに注意してください。しかし、私はJava開発者(JavaScriptであることに偏見を持っているかもしれません)が

nudge4j

に公正な機会を与えることを望みます。


2.3. JVMインタラクションの範囲


nudge4j

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

状況によっては、自分のアプリケーションだけに固有の1つ以上のオブジェクトにアクセスして、それらを操作できるようにする必要があります。


nudge4j

はそれを可能にします。公開する必要があるすべてのオブジェクトは、インスタンス化時に引数として渡すことができます。


2.4. 例外処理


nudge4j

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

実行されたコードの断片がExceptionをスローする結果になるスクリーンショットを見てみましょう:

リンク:/uploads/nudge4j.exception.488×711-206×300.png%20206w[]


3アプリケーションに

nudge4j

を追加する


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


nudge4j

との統合は、クラスパスに追加する

jar

ファイルがなく、MavenまたはGradleのビルドに追加する依存関係がないため、やや異例な方法で行われています。

代わりに、実行する前に、わずか100行のJavaコードをコピーして自分のコードに貼り付ける必要があります。

あなたはhttps://lorenzoongithub.github.io/nudge4j/[

nudge4j

home page]にスニペットを見つけるでしょう – あなたがクリップボードにスニペットをコピーするためにクリックできるページさえボタンがあります。

このコードの断片は、最初はかなり難解に見えるかもしれません。その理由はいくつかあります。


  • nudge4j

    スニペットはどのクラスにもドロップできます。したがって、それ


__import

__sやクラスに関する仮定をすることができませんでした
含まれるものは完全に修飾されていなければなりませんでした
** 既に定義された変数との潜在的な衝突を避けるために、コードは

関数にラップ
** 組み込みのJDK HttpServerへのアクセスは、のイントロスペクションを介して行われます。


“ com.sun。** ”

で始まるパッケージに対するいくつかのIDE(例えばEclipse)に存在する制限を避けるため

そのため、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

の要約を提供します(この場合は

Map



toString()

メソッドとそのキーと値に依存します)。

キー値

“tools”

を使用して

Map

エントリを調べて変更するとします。


Map

内のすべての利用可能な

tools

のリストを取得するには、次のように書きます。

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

そして

Map

に新しい

tool

を追加するには、次のように書きます。

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

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


4結論

JDK内の2つの単純なAPI(

Nashorn

および

Http server

)を組み合わせることによって、

nudge4j

はJava 8アプリケーションを詳しく調べることを可能にします。

ある意味で、

nudge4j

は古い考えを現代的に切り取ったものに過ぎません。開発者がスクリプト言語を介して既存のシステムの機能にアクセスできるようにすることです。