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

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

java - 呼び出し元に依存する API を簡単にラップするにはどうすればよいですか?

特定の Java API は、呼び出し元に依存します。1 つの (非常に文書化されていない IMO) 例はSystem.load()、一部の JNI コードを呼び出し元ClassLoaderのみにロードする です。

おおよそのようなラッパーがありますJniUtils.loadLibrary("nameoflibrary")。現在のアーキテクチャに適したライブラリを見つけて、JAR から抽出し、に渡しSystem.load()ます。しかし、の呼び出し元がそれ自体JniUtils.loadLibraryと同じでないClassLoader場合に遭遇しました。Jniこれにより、ライブラリが間違った にロードされ、ネイティブ メソッドが呼び出されるようClassLoaderになりました。UnsatisfiedLinkError

のような JVM 内部に依存せずにsun.reflect.Reflection.getCallerClass()、この問題を回避する方法はありますか? 私の現在の考えは、ラッパーを次のように変更することです。

これは次のように呼び出すことができます:

を使用してメソッドLookupを解決して呼び出すと、 caller として保存する必要があります。System.load()NeedsJni

より良い回避策はありますか?

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

java - lookup.findvirtual: classParameter がメソッド パラメータとして追加されています

私の問題は次のとおりです。invoke dynamic を使用しようとしていますが、findVirtual と invoke に問題があります。

findVirtual で最初の問題があります。次の MethodType (GMD,FIXML)FIXML で methodHandle を取得しています --> これは正しくありません。なぜなら、私のメソッドは"public FIXML name_method(FIXML)"であり、findVirtual は methodHandle を作成しているからです" public FIXML name_method(GMD,FIXML)"、findVirtual が "com.etc2.foo.GMD" をパラメーターとして使用していることを理解しています。ここからの最初の質問: findVirtual が methodHandle FIXML name_method(FIXML) を返すようにするにはどうすればよいですか??

2番目の問題は最初の問題から来ていると思います... methodHandleでメソッドを呼び出すと

「java.lang.invoke.WrongMethodTypeException: MethodHandle(GMD,FIXML)FIXML を (Object)Object に変換できません」というエラーが表示されます。

実際...私は他の質問を調べていて、別の解決策を試しましたが、何もうまくいきませんでした.

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

java - 別のクラスから getter/setter への MethodHandle が NoSuchFieldError を返す

getter と setterを持つ単純な javabeanMyPersonがあるとします。name

今、私は単にそのnameフィールドを取得して設定するこのメイン コードを実行しています。

そのmain()メソッドを classに追加するとMyPerson、期待どおりの結果が得られます。

別のパッケージの別のクラスに同じmain()メソッドを追加すると、次の奇妙なエラーが発生します。

なんで?の getter/setter は public であるため、MethodHandles を介しても使用しないMyPerson理由はありません。MyMain

ソース/ターゲット レベルの Java 8 で JDK 8 を使用する。

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

java - findVirtual を使用して呼び出されるメソッドハンドル プライベート メソッド

MethodHandle の Java ドキュメントには、プライベート メソッドは findSpecial を介して呼び出す必要があると記載されていますが、次の例では、findVirtual を介して呼び出すことができます。

誰かがここで何が欠けているのか説明してもらえますか?

0 投票する
0 に答える
349 参照

java - Java 8 Update 51 (sun-jdk-8u51) 448 の System::gc Runnable 引数を使用した null MethodHandle invokeExact 呼び出し後のランタイム致命的エラー

概要

Runnable メソッド参照 (System::gc) の 448 インスタンスで null MethodHandle の invokeExact メソッドを呼び出すメイン メソッドを持つインターフェイスをコンパイルできました。

インターフェイスを実行すると、Java ランタイム環境によって致命的なエラーが検出されました。

  • pc=0xb71b9bde、pid=12918、tid=3030936432 の SIGSEGV (0xb)
  • JRE バージョン: Java(TM) SE ランタイム環境 (8.0_51-b16) (ビルド 1.8.0_51-b16)
  • Java VM: Java HotSpot(TM) クライアント VM (25.51-b03 混合モード linux-x86 )
  • 問題のあるフレーム:
    • V [libjvm.so+0x507bde] SignatureIterator::parse_type()+0x1ce

ソースコードと実行結果のリンク: http://ideone.com/3oh7Uk

ソース

結果

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

java - MethodHandles.Lookup を使用して配列コンストラクタ MethodHandle を検索するにはどうすればよいですか?

MethodHandleのような配列コンストラクターを取得するにはどうすればよいint[]::newですか?

これは機能しません:

その結果、次のようになります。

これもありません:

Object代わりにコンストラクターを見つけるようです:

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

java - Java メソッド ハンドル: 関数間でバインドされていない引数を伝播します

メソッド ハンドル ツリーのプレースホルダーにバインドされる値を引数として渡すことができるメソッド ハンドルを作成したいと考えています。

図、次のようなもの: f(x) = plus( minus( x, 2), 3)x は呼び出し時に渡され、2 と 3 は定数 MethodHandles で、常に 2 または 3 を返します。

私は理解できない問題を抱えています:

plus_3 をフィルタリングしようとすると、次の例外が返されます。

私が理解していないのは、プラスをマイナスで構成する方法です。ここで、マイナスにはまだ満たされていない引数が 1 つあります。

手伝って頂けますか?