問題タブ [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.

0 投票する
1 に答える
343 参照

java - JavaでNashornを使用していますか?

Java 8 の新機能について読んでいて、Nashorn (Javascript エンジン) が付属していることを知りました。Java内でJavascriptエンジンを使用する/すべき理由を誰かが説明してくれますか? どのようなプログラミングの問題を解決しますか? 任意の例

ありがとう、ラヴィ

0 投票する
2 に答える
1555 参照

java - Nashorn のトラブルシューティング「メソッド コードが大きすぎます!」例外

実行中jjsまたはScriptEngine#evalJavaScript ( https://gist.github.com/also/005fd7c200b20f012e10 ) でクラッシュすると、この例外が発生し、それ以上の詳細はありません:

メソッド コードが大きくなりすぎている原因を特定するにはどうすればよいですか? jjs( )に対していくつかのログ オプションを試しまし--log=codegen:infoたが、原因を突き止めるものは何も見当たりませんでした。

Java バージョン 1.9.0-ea-b34 および 1.8.0_20-b26 でテストしました。

0 投票する
3 に答える
2627 参照

java - Java 8 Nashorn - engine.eval("print('hello world')) を文字列オブジェクトにキャプチャしますか?

Nashorn 内の print('hello world') の結果をキャプチャして String オブジェクトに配置する方法はありますか。

私はこれを試しました:

エンジンがこのJavaScriptを評価すると、標準出力に出力されるだけなので、標準出力を独自のOutputStreamにリダイレクトしてから文字列に変換するだけだと考えましたが、機能しません。

何かご意見は?

0 投票する
1 に答える
1692 参照

java - Nashorn JO4 と NativeArray の読み取り

Java 呼び出しコード:

Javascript:

ゴール:

Map 値ごとに、次のことを試して失敗しました。

  • ScriptObject または ScriptObjectMirror へのキャスト
  • マップまたはリストへのキャスト
  • JO4/NativeArray メソッドへの直接アクセス
  • ScriptUtils.wrap() / ScriptUtils.unwrap()

HashMap.put()メソッドをオーバーライドしようとしましたがScriptObjectMirror、割り当てでは変換されず、明示的な関数呼び出しでのみ変換されるようです:

本当に myCustomHashMap を使用する必要があるため (変更にタイムスタンプを付け、変更リストを維持するなど)、この配置を根本的に変更することはできません。このデータを元に戻すにはどうすればよいですか?

0 投票する
1 に答える
426 参照

java - java javascript スクリプト API を使用した HTML ノードの操作

私はJava Scripting APIを使用していますが、これは非常にうまく機能しています。これで、文字列からすべての<a>タグを取得し、操作された文字列を返す前に属性を追加/削除する関数があります。もちろん、問題は、単に使用できないことdocument.getElementsByTagNameです。正規表現地獄を経由せずに頭に浮かぶ簡単なオプションはありますか?

私は現在 Java 7 (Rhino を使用) で実行しており、Java 8 (Nashorn を使用) に更新する予定であるため、Rhino 固有の API を使用したくないことに注意してください。

0 投票する
1 に答える
1399 参照

java - Oracle NashornのJavaオブジェクトで関数を上書きして呼び出す方法は?

私は、いくつかの Java コードによって初期化する必要がある Java オブジェクトを持っています。このオブジェクトは、nashorn エンジンに入れられます。このオブジェクトのメソッドを上書きする JavaScript コードが呼び出されます。後でJavaに戻り、上書きされたメソッドを呼び出す必要があります。

このコードは機能しません:

まず、メソッド "test" は上書きされません -> それを呼び出すと "3" が返されます。2 番目: 元の「テスト」メソッドを呼び出すと、「非スクリプト オブジェクトで getInterface を呼び出すことはできません」という例外で失敗します。

0 投票する
2 に答える
11621 参照

java - Java 8 Nashorn を高速化するにはどうすればよいですか?

Java 8 Nashorn を使用して、CommonMarkを HTML サーバー側にレンダリングしています。をコンパイルしてキャッシュし、再利用するCompiledScriptと、特定のページのレンダリングに 5 分かかります。ただし、代わりに を使用evalし、スクリプト エンジンをキャッシュして再利用すると、同じページのレンダリングに 3 秒かかります。

なぜCompiledScriptそんなに遅いのですか?(サンプル コードは次のとおりです)

Nashorn で Javascript コードをできるだけ速く何度も実行するための良いアプローチは何ですか? そして、Javascript コードを複数回コンパイルするのを避けますか?

これは、5 分かかる方法で Nashorn を呼び出すサーバー側の Scala コード スニペットです: (200 回実行すると、CommonMark からの多くのコメントを HTML にコンパイルしています )

編集$script上記は 200 回再評価されることに注意してください。一度だけ評価するバージョンをテストしましたが、どうやらバグを書いたようです.1回だけのバージョンは5分より速くなかったので、最速のものの1つであるはずでした.Halfbitの答えを見てください. 高速バージョンは次のとおりです。

/編集

これには2.7秒かかりますが:(200回実行した場合)

CompiledScript私は実際、バージョン (一番上のスニペット) の方が高速であると推測していました。とにかく、レンダリングされた HTML サーバー側をキャッシュする必要があると思います。

(Linux Mint 17 & Java 8 u20)

アップデート:

invokeFunctionの代わりに最後に使用すると、evalほぼ 2 倍速くなり、わずか 1.7 秒しかかからないことに気付きました。これは、Rhino によって Java バイトコードにコンパイルされた Javascript コードを使用した私の Java 7 バージョンとほぼ同じ速さです (ビルド プロセスの別の複雑なステップとして)。おそらく、これは可能な限り高速ですか?

0 投票する
2 に答える
1382 参照

java - Java が選択する JS スクリプト エンジンはどれですか?

ScriptEngineManager.getEngineByName は、特定の名前の ScriptEngine を検索して作成します。

Rhino は自身を「js」、「rhino」、「JavaScript」、「javascript」、「ECMAScript」、および「ecmascript」として登録します。

Nashorn は、自身を「nashorn」、「Nashorn」、「js」、「JS」、「JavaScript」、「javascript」、「ECMAScript」、および「ecmascript」として登録します。

Nashorn と Rhino の両方が登録している "js" のような名前を使用すると、どのスクリプト エンジンが使用されますか? Java 8 では Nashorn を使用し、それ以外の場合は Rhino を使用しますか?