問題タブ [nashorn]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java で Nashorn JsonObject を取得する
私の JavaScript には、Java オブジェクトのパラメーターとして使用する JSON オブジェクトがあります。Java側では、クラスjdk.nashorn.internal.scripts.JO4のみが終了します。jdk.nashorn.internal.scripts.JOこの JSON オブジェクトにアクセスするにはどうすればよいですか?
javascript - break および continue ステートメントにより、Nashorn で最終的にブロックが実行される
/ (バージョン: Java 8 update 5)finallyの後に実行される理由がわかりませんbreakcontinue
実行:
.../tmp>jjs test.js
出力break:
continueの代わりに出力break
ブラウザで同じコードを実行しようとしましたprint()(console.log()
出力は Firebug で期待どおりです
java - nashorn スクリプトを実行している Java スレッドに割り込む
以下のコードでは、メインスレッドとは別のスレッドで JavaScript を実行しています。そのスクリプトは無限ループなので、何らかの方法で終了する必要があります。どのように?
スクリプトの実行が開始された後、.cancel() の呼び出しが機能しません。しかし、スレッドの初期化の直後に .cancel() を呼び出すと、スレッドが終了します (コメントアウトされた行)。
java - Nashornを使用してJavaScriptでJavaクラスをインスタンス化する方法は?
Java コード
JavaScript コード
これは私がやろうとしていることのほとんどです。私が作成しているアプリケーションDoubleでは、組み込みブラウザーで使用するために Java 部分を JavaScript に転送する必要があります。aJavaClassNashorn とそのためのいくつかのチュートリアルを調べましたが、それらのコードは問題ありませんが、私のコードはが宣言されるたびに正しく実行されません。この行がなければ、すべてが機能します。
この時点で、私が考えることができる唯一のことは、インポートの問題があることですが、それをテストする方法については確信が持てません.
JS が私のクラスを認識しない理由はありますか?
console - null オブジェクトを評価 -> nashorn コンソール クラッシュ (「デフォルトの文字列値を取得できません」)
私はJavaScriptが初めてです。nashorn 1.8.0_11 では、以下の動作が見られます。Noteは正常にprint(x)動作しますが、評価xするとクラッシュが発生します。これをバグと見なしてもいいですか?もしそうなら、それは既知のバグですか?
java - Java ScriptEngine インスタンスを破棄するにはどうすればよいですか?
私は Java 8 を使用しています。私は Java の専門家ではありません (10 年前の大学時代から Java を見たことはありません)。
ScriptEngine (重要な場合は Nashorn) のインスタンスを作成します。これを使用して、いくつかの JavaScript ファイルを評価します。
スクリプトは、独自の小さな JavaScript の世界で非常に楽しく動きます。大好きです。
一部の Java スクリプトが変更された場合に備えて、File System WatchService も実行しています。それらが変更されたら、新しい ScriptEngine を作成し、新しい ScriptEngine オブジェクトを使用して JavaScript ファイルの新しいバージョンを評価します。
私の問題は、新しいscriptEngineを作成すると、古いscriptEngineを「殺す」ことができないことです。古いスクリプトは無期限に実行され続けます。
古い scriptEngine オブジェクトによって使用されているリソースを解放したいと考えています。そして、私はそれがやっていることをやめる必要があります(両方が同じことをしようとすると、新しいインスタンスと競合する可能性があるため)。
では、内部で生成されたスレッドを含め、古い ScriptEngine を完全に削除するにはどうすればよいでしょうか?
java - Nashorn、Java コレクション、純粋な JavaScript で equals と hashCode を実装する方法
次の問題に直面しました。特定のカスタム オブジェクトをHashMap のキーとして使用する必要があるNashornスクリプトで、およびMap にキーがあるかどうかを確認するために使用したいと思います (別のオプションは、java.util.HashMapオブジェクトがCollection.contains(Object o))。java.util.PriorityQueueHashMap.containsKey()
したがって、明らかに、いくつかのフィールド値に基づいて、オブジェクトに equals と hashCode を実装する必要があります。
例えば:
JavaScript を使用しようとしています。JavaScript にはこれらのメソッドがないため、機能しません。サンプル1とサンプル2をご覧ください
java.lang.Object を拡張します。サンプル 3 . 部分的に動作し、メソッドが呼び出されています。しかし
- パラメータを使用してコンストラクタをプラグインする方法は?
- this:[object Object] から other:jdk.nashorn.javaadapters.java.lang.Object@0 へ、またはその逆へのキャストを行う方法は?
カスタム クラスを Java で実装し、JavaScript で拡張します。サンプル 4。動作します。しかし、Java を使用する必要がある場合、Nashorn は必要ですか?
編集1
@Tomasz、ありがとう。言及されたすべてのリンクを見てきました。しかし、それはやや文書化されていませんが存在します。Nashornでほとんどあきらめました。次の部分的な解決策に達しました。メソッドが呼び出され、コンストラクターが使用されていますが、元のオブジェクトのフィールドにアクセスするためにメソッドをキャストother.fromするequalsfrom方法(このコードは頂点のインスタンスごとに異なるクラスを生成します):
編集2
彼が指摘したように、Tomasz に感謝します。クラス固有の実装オブジェクトを使用して Java.extend() 関数を呼び出すたびに、新しい Java アダプター クラスが生成されます。したがって、彼がサンプルで示したように、1 つのオブジェクト エクステンダーが必要であり、その 1 つのタイプでオブジェクトをインスタンス化する必要があります。少し変更したので、同じオブジェクト エクステンダーを使用しているため、ファクトリまたは直接コンストラクターのいずれかで同じクラスのインスタンスが生成されます。
ただし、まだ問題があります。 のパラメータの型はequalsです。jdk.nashorn.javaadapters.java.lang.Objectつまり、otherとthis内部equalsは異なる型です。に渡されたオブジェクトから値をキャストまたは取得する方法はあり_fromequalsますか?
ソリューション
問題の解決策は、Tomasz の回答にあります。
頑張れトーマス!ありがとう。
PS : Nashorn でequals実装するきちんとした簡単な方法がないことは非常に悲しいことです。hashCodeプロトタイピングに役立ちます。それとこれを比較してください:)