問題タブ [methodhandle]
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 7 - MethodHandles - invokeExact() および bindTo()
MethodHandle クラスに関する 2 つの質問:
invokeExact() へのすべての呼び出しで戻り値の型キャストが必要であるというのは本当ですか (void または Object を返すターゲット メソッドを除く) ?
MethodHandle は、レシーバーに 1 回しかバインドできないようです。任意の MethodHandle インスタンスが与えられた場合、それが既にバインドされているかどうか、もしそうならどの型にバインドされているかを判断する方法はありますか?
java - 戻り値の型を任意のオブジェクトとして一般的な `MethodType` を表現する
以下を私の問題のクラスにしましょう:
MethodType
「任意の」オブジェクトを返すメソッドを記述するインスタンスを作成したいと考えています。私は次のことを試みています:
次に、を使用して方法を見つけようとします
上記の行を使用すると、例外が発生します。
私の観察では、メソッドの戻り値の型はまったく同じ型でなければなりません。つまりString.class
、上記のステートメントで定義するために使用する必要がありましたMethodType
。これは正しいです?私が説明した方法でこれを行うことができ、できればリフレクション API を使用しない方法はありますか?
java - Field.set (おそらく MethodHandles を使用) のパフォーマンスを向上させるにはどうすればよいですか?
私は何千回も呼び出すコードField.set
を書いています。Field.get
明らかに、これはリフレクションのために非常に遅いです。
Java 7を使用してパフォーマンスを改善できるかどうかを確認したいと思いMethodHandle
ます。これまでのところ、私が持っているものは次のとおりです。
の代わりにfield.set(pojo, value)
、私はやっています:
ただし、これは、リフレクションを使用した Field.set 呼び出しよりもパフォーマンスが優れているようには見えません。ここで何か間違ったことをしていますか?
invokeExact
を使用すると高速になる可能性があることを読みましたが、それを使用しようとするとjava.lang.invoke.WrongMethodTypeException
.
Field.set または Field.get への繰り返し呼び出しを最適化できた人はいますか?
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 です。
java - MethodHandles.lookup() の結果をキャッシュしていますか?
MethodHandles.Lookup
授業が頻繁に利用される状況で働いています。この状況では、MethodHandles.lookup()
複数のルックアップ間で の値を保持するのが賢明でしょうか? (具体的には、私が使用している唯一の検索方法は ですunreflect(java.lang.reflect.Method)
。)
これは何かを高速化しますか、それとも無関係でしょうか? それとも、何らかの理由で実際に速度が低下しますか?
java - MethodHandles.publicLookup() と Method.setAccessible(true) の組み合わせ
publicLookup()
これは for public メソッドよりも高速であることを理解しておりlookup()
、それを利用したいと考えています。本質的に公開されていないが、私が呼び出したもので使用する場合MethodHandles.publicLookup().unreflect(Method)
、それは機能しますか?Method
setAccessible(true)
java - MethodHandle インスタンスを比較するには?
MethodHandle
2 つのインスタンスを比較するにはどうすればよいですか? ハンドルが同じメソッドを指している場合、関数が true を返すことを期待しています。equals()
クラスのオーバーライドまたはのようには見えませんhashcode()
。等値演算子 ( ==
) を使用しても安全ですか?
java - Java メソッドハンドル
}
なぜこのエラーが発生するのですか?
java.lang.invoke.WrongMethodTypeException: MethodHandle(HomePresenter,ListIterator,Text)void を (ListIterator,Text)void に変換できません