web-dev-qa-db-ja.com

invokedynamicとは何で、どのように使用しますか?

JVMに追加されているすべての新しいクールな機能についてよく耳にしますが、それらのクールな機能の1つがinvokedynamicです。 Javaより簡単またはより良い方法で、それがどのようなもので、どのようにリフレクティブプログラミングを行うのかを知りたいですか?

150
davidk01

これは、新しいJVM命令であり、コンパイラが以前よりも緩い仕様でメソッドを呼び出すコードを生成できるようにします。「 ducktyping 」とは何かを知っていれば、invokedynamicは基本的にアヒルのタイピング用。 Javaプログラマーができることはあまりありません。ツールの作成者であれば、それを使用してより柔軟で効率的なJVMベースの言語を構築できます。 Here は、多くの詳細を提供する本当に素敵なブログ投稿です。

157

少し前に、C#はC#内に動的な構文であるクールな機能を追加しました

Object obj = ...; // no static type available 
dynamic duck = obj;
duck.quack(); // or any method. no compiler checking.

リフレクティブメソッド呼び出しの構文シュガーと考えてください。非常に興味深いアプリケーションを持つことができます。 http://www.infoq.com/presentations/Statically-Dynamic-Typing-Neal-Gafter を参照してください

C#の動的型を担当するNeal Gafterは、SunからMSに亡命しました。したがって、同じことがSun内で議論されたと考えるのは理不尽ではありません。

その後すぐに、いくつかのJava男が似たようなことを発表したことを覚えています

InvokeDynamic duck = obj;
duck.quack(); 

残念ながら、この機能はJava 7のどこにもありません。非常に残念です。 Javaプログラマーにとっては、プログラムでinvokedynamicを利用する簡単な方法はありません。

8
irreputable

動的呼び出しを続行する前に理解する必要がある2つの概念があります。

1。静的入力とダイナミン入力

静的-コンパイル時に型チェックを実行します(Javaなど)

動的-実行時に型チェックを実行します(JavaScriptなど)

タイプチェックは、プログラムがタイプセーフであることを確認するプロセスです。これは、クラスおよびインスタンス変数、メソッドパラメーター、戻り値、およびその他の変数の型付き情報をチェックすることです。例えば。 Javaは、コンパイル時にint、Stringなどを認識しますが、JavaScriptのオブジェクトのタイプは実行時にのみ決定できます

2。強い入力と弱い入力

Strong-操作に提供される値のタイプの制限を指定します(Javaなど)

-操作の引数に互換性のない型がある場合(Visual Basicなど)に変換(キャスト)します

Javaは静的かつ弱く型付けされていることを知っているので、JVMで動的かつ強く型付けされた言語をどのように実装しますか?

invokedynamicは、プログラムがコンパイルされた後、メソッドまたは関数の最も適切な実装を選択できるランタイムシステムを実装します。

例:(a + b)を持ち、コンパイル時に変数a、bについて何も知らない場合、invokedynamicはこの操作をJavaの最も適切なメソッドにマッピングします。たとえば、a、bが文字列である場合はmethod(String a、String b)を呼び出し、a、bがintである場合はmethod(int a、int b)を呼び出します。

invokedynamicはJava 7。

4
Sabina Orazem