Java7の名前付きメソッドハンドラーに新しいものが追加されているようです。それらはどのようなシナリオに役立ちますか?
3 に答える
http://www.oracle.com/technetwork/articles/javase/index-136358.html
JDK7でのJSR292のサポートの追加により、動的に型指定された言語は、現在よりもJVMで高速に実行されるはずです。このサポートの重要な部分は、メソッド呼び出し用の新しいJavaバイトコードinvokedynamicと、メソッドハンドルと呼ばれる新しい構造を含む付随するリンケージメカニズムの追加です。これらの機能により、動的に型付けされた言語のコンパイラーの実装者、つまり、JRubyやJythonなどの言語のコンパイラーを開発する人々は、JVMで非常に高速に実行されるバイトコードを生成できます。
..。
メソッドハンドルは、JVMメソッドへの匿名参照を含むjava.dyn.MethodHandle型の単純なオブジェクトです。メソッドハンドルは、メソッドへの名前付き参照と同じように呼び出すことができます。ただし、これがユニークなのは、リンクされた名前ではなく、ポインタ構造を介してアクセスされることです。
IMHOそれは時代を先取りしたツールです。リフレクションを置き換えることを目的としていますが、パフォーマンスの問題がいくつかあります(はるかに高速または低速になる可能性がありますが、一貫して高速ではありません)。synatxも少し面倒です。
Java 8で登場するのは、クロージャとファーストクラスのメソッド参照です。MethodHandlesはこれに大きな役割を果たし、その使用/構文を自然で統合されたものにします。つまり、このクラスを直接参照しなくても新しいJava構文を使用できるようになり、コンパイラは、現在のリフレクションでは実行できない方法で、型のチェックと例外スローを支援します。Java 8がリリースされるまでに、パフォーマンスの問題も解決されると思います。
JDK 7は、この動的/ランタイム検査に新しいプレーヤーであるメソッドハンドル(つまり、抽象クラスjava.dyn.MethodHandleのサブクラス)を導入します。メソッドハンドルは、非公開メソッドを呼び出すための無制限の機能を提供します。たとえば、非公開メソッドにアクセスできるクラスによって非公開メソッド上に形成できます。Reflection APIを使用する場合と比較して、アクセスチェックは、メソッドが呼び出されるたびではなく、メソッドハンドルが作成されるときに実行されます。
MethodHandleとその使用法を垣間見ることから直接取得
その時点で、私はセグフォールトしました