1

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

Class<?> returnTypeClass = Class.forName("com.etc1.foo.FIXML"); 
MethodHandles.Lookup lookup = MethodHandles.lookup();




MethodType methodType = MethodType.methodType(returnTypeClass ,returnTypeClass); //The method which will be invoked has as a param FIXML object and return a FIXML object

MethodHandle methodHandle = lookup.findVirtual(
                        com.etc2.foo.GMD, 
                        "name_method", 
                        methodType);

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でメソッドを呼び出すと

com.etc1.foo.FIXML fixml;
com.etc1.foo.FIXML fixml2;
fixml2 = (FIXML) methodHandle.invoke(fixml);

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

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

4

2 に答える 2

0

JVM は、メソッド解決が行われるメソッドにinvokedynamic渡されるパラメーターを作成するため、を使用するときにも同じことに遭遇する可能性があります。見つかったエラーを回避するには、メソッドを呼び出す必要があるクラスを引数bootrstrapから削除する必要があります。MethodType

public static CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType type) {
    final MethodHandle mh = caller.findVirtual(type.parameterType(0), name, type.dropParameterTypes(0, 1));
    final MutableCallSite callSite = new MutableCallSite(mh);
    return callSite;
}
于 2017-09-11T07:07:29.233 に答える