問題タブ [invokedynamic]

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 投票する
3 に答える
3872 参照

java - java.lang.invoke.MethodHandle でプライベート メソッドを呼び出す

メソッド ハンドルを使用してプライベート メソッドを呼び出すにはどうすればよいですか?

私が見る限り、公的にアクセス可能なLookupインスタンスは 2 種類しかありません。

  • MethodHandles.lookup()
  • MethodHandles.publicLookup()

また、無制限のプライベート アクセスも許可しません。

Lookup.IMPL_LOOKUP私がやりたいことをしている非公開があります。それを取得する公的な方法はありますか (SecurityManager が許可していると仮定して) ?

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

java - ポリモーフィズムでメソッドを実行するためにinvokedynamicを使用する方法は?

すべての変数が として宣言されている Java の動的言語では、java.lang.ObjectJava 組み込みクラスを呼び出す必要があります。たとえば、java.math.BigDecimalコンストラクターは数値、文字列などを受け入れることができます。

java.lang.invoke適切な生成に使用できるものはありますMethodHandleか? は引数としてMethodHandleを受け入れる必要がありますが、呼び出されたときに適切なコンストラクターを呼び出す必要があります。java.lang.Object

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

ruby - jrubyc が Linux の invokedynamic パラメータで失敗する

ウィンドウではすべてうまくいきましたが、Linux では失敗しました。私がやりたいことは、Ruby スクリプトを -Xcompile.invokedynamic=true パラメーターを使用して Java バイトコードにコンパイルすることです。

-Xcompile.invokedynamic=true を指定しないと、jrubyc は機能しますが、生成されたバイトコードに invokedynamic 命令はありません。また、

ウィンドウで動作し、ウィンドウのクラスファイルでinvokedynamicを見ました。

他のすべての jrubyc プロパティ (.jrubyrc) をデフォルト値のままにします

hello.rb は 1 行の Ruby スクリプトです。

jrubyc 1.7.6 と同じエラーも試しました。誰でも手がかりを提供できますか?

[アップデート]:

最後に、例外は jrubyc が -Xcompile.invokedynamic=true オプションをサポートしていないことを示していると思います。jruby wiki ページには、"jrubyc" の代わりに jruby と書かれており、オプションで動作します。

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

java - ブートストラップ メソッドは Java の定数プールにどのように登録されますか?

最近、invokedynamicとMethodHandlesの情報を探し回っています。

BOTHLinkage.registerBootstrapMethod()@BootstrapMethodは、ブートストラップ メソッドをそのようにマークする手段として非推奨になっているようです。

定数プールにどのように登録されていますか?

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

java - Object[] の配列で MethodHandle.invokeExact() を呼び出す方法は?

Java の MethodHandle.invokeExact(Object...args) は、引数の可変長リストを取ります。ただし、リストの代わりに Object [] の配列を渡そうとすると、エラーが発生します。下記参照:

invokeExact() の 2 回目の呼び出しで、次の例外が生成されます。

これは、2 年前に修正された Eclipse のバグ ( https://bugs.eclipse.org/bugs/show_bug.cgi?id=385404 ) に関連している可能性がありますが、Eclipse を閉じると、 /target ディレクトリを削除し、Maven を使用してすべてを再コンパイルし、コマンド ラインから実行しても同じ結果が得られます。

私は Eclipse Kepler SR2 を使用しており、すべてが完全に最新で、JDK 1.7.0_25 です。

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

dynamic - (遅延定数以外に) invokedynamic が実際に役立つのはいつですか?

TL;DR

よく知られている動的言語 (JavaScript など) で記述されたコードの一部と、invokedynamic を使用した Java バイトコードでそのコードがどのように見えるかを提供し、invokedynamic の使用がここで一歩前進した理由を説明してください。

バックグラウンド

インターネット上の誰もがJVM上の動的言語の高速化に役立つことに同意する、それほど新しくはないinvokedynamic命令について、私はググってかなりの量を読みました。stackoverflow のおかげで、Sable/Jasmin を使用して独自のバイトコード命令を実行することができました。

私は、invokedynamic が遅延定数に役立つことを理解しました。また、OpenJDK が lambdas に対してどのように invokedynamic を利用するかを理解したと思います。

Oracleには小さな例がありますが、この場合のinvokedynamicの使用法を知る限り、「加算器」の例ははるかに単純で高速で、次のバイトコードで表現されるほぼ同じ効果を持つため、目的を無効にします。

なんらかの理由で、Oracle のブートストラップ メソッドは両方の引数が整数であることを認識しているためです。彼らは次のことを「認めます」。

[..]引数が[..]整数オブジェクトになると仮定します。ブートストラップ メソッドのパラメーター (この例では、callerClass、dynMethodName、および dynMethodType) が異なる場合、ブートストラップ メソッドには、invokedynamic [..] を適切にリンクする追加のコードが必要です。

そうです、その興味深い「追加コード」がなければ、invokedynamic をここで使用しても意味がありませんね。

そのため、Javadoc とブログのエントリをいくつか追加した後、invokestatic/invokevirtual/invokevirtual または getfield が同様に機能する場合に、invokedynamic を適切な代替手段として使用する方法について、かなりよく理解していると思います。

今、実際にinvokedynamic命令を実際のユースケースに適用して、「従来の」呼び出しでできることを実際に改善する方法に興味があります(遅延定数を除く、私はそれらを手に入れました...)。

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

java - MethodHandle::invokeExact をメソッド参照として使用したために発生した LambdaConversionException によって発生した BootstrapMethodError

MethodHandle::invoke または MethodHandle::invokeExact を、MethodHandle を受け入れて生成された出力を返す関数インターフェイスのメソッド参照として使用できるかどうかを確認しようとしていました。

(invoke と invokeExact はシグネチャ ポリモーフィックであるため、InvokeExact でのメタファクトリ呼び出しであることはわかっています。ただし、invoke/invokeExact の適切なバージョンを派生させるために必要だった作業をコンパイラが省略できるかどうかを知りたかったのです。)

呼び出す.InvokeExact0

結果

良いニュースは、メタファクトリ アプローチが機能する機能インターフェイス インスタンスを合成できたことです (印刷されているように: invoke.InvokeExact0$$Lambda$1/1878246837@1be6f5c3 )。悪いニュースは、メソッド参照アプローチが LambdaConversionException を引き起こし、それがさらに BootstrapMethodError を引き起こしたことです。

とにかくメタファクトリの回避策が存在するため、LambdaConversionException のエラーの詳細をどのように解釈することになっているのかを尋ねたいと思います。