問題タブ [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 - 呼び出し元に依存する 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
より良い回避策はありますか?
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 に変換できません」というエラーが表示されます。
実際...私は他の質問を調べていて、別の解決策を試しましたが、何もうまくいきませんでした.
java - 別のクラスから getter/setter への MethodHandle が NoSuchFieldError を返す
getter と setterを持つ単純な javabeanMyPerson
があるとします。name
今、私は単にそのname
フィールドを取得して設定するこのメイン コードを実行しています。
そのmain()
メソッドを classに追加するとMyPerson
、期待どおりの結果が得られます。
別のパッケージの別のクラスに同じmain()
メソッドを追加すると、次の奇妙なエラーが発生します。
なんで?の getter/setter は public であるため、MethodHandles を介しても使用しないMyPerson
理由はありません。MyMain
ソース/ターゲット レベルの Java 8 で JDK 8 を使用する。
java - findVirtual を使用して呼び出されるメソッドハンドル プライベート メソッド
MethodHandle の Java ドキュメントには、プライベート メソッドは findSpecial を介して呼び出す必要があると記載されていますが、次の例では、findVirtual を介して呼び出すことができます。
誰かがここで何が欠けているのか説明してもらえますか?
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
ソース
結果
java - MethodHandles.Lookup を使用して配列コンストラクタ MethodHandle を検索するにはどうすればよいですか?
MethodHandle
のような配列コンストラクターを取得するにはどうすればよいint[]::new
ですか?
これは機能しません:
その結果、次のようになります。
これもありません:
Object
代わりにコンストラクターを見つけるようです:
java - Java メソッド ハンドル: 関数間でバインドされていない引数を伝播します
メソッド ハンドル ツリーのプレースホルダーにバインドされる値を引数として渡すことができるメソッド ハンドルを作成したいと考えています。
図、次のようなもの: f(x) = plus( minus( x, 2), 3)
x は呼び出し時に渡され、2 と 3 は定数 MethodHandles で、常に 2 または 3 を返します。
私は理解できない問題を抱えています:
plus_3 をフィルタリングしようとすると、次の例外が返されます。
私が理解していないのは、プラスをマイナスで構成する方法です。ここで、マイナスにはまだ満たされていない引数が 1 つあります。
手伝って頂けますか?