0

以前の投稿から、デフォルトのメソッドを動的に呼び出す方法は次のとおりであることがわかりました。

final Class<?> declaringClass = method.getDeclaringClass();

final Constructor<Lookup> constructor =  
MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);

constructor.setAccessible(true);

final MethodHandles.Lookup defaultMethodLookup =
                constructor.newInstance(declaringClass, MethodHandles.Lookup.PRIVATE);

return defaultMethodLookup
            .unreflectSpecial(method, declaringClass)
            .bindTo(proxy)
            .invokeWithArguments(args);

これは問題なく動作します。ただし、呼び出しが特定のメソッドをオーバーライドする派生インターフェイスからのものである場合、上記のコードは基本インターフェイスのメソッドを呼び出します。

したがって、問題は、「void fire()」などの基本インターフェースにデフォルトのメソッドがあり、サブインターフェースがこのメソッドをオーバーライドし、デフォルトのメソッドを呼び出すメカニズムが常に 1 つだけを呼び出す場合です。基本クラスで。

4

1 に答える 1

0

更新のためだけに、私はそれを別の方法で解決することができました。したがって、基本的にはプロキシを介して現在のオブジェクトを追跡するため、リフレクションを介して正しい (派生) メソッドを取得し、それに対して MethodLookup を実行すると、これは正常に機能しました。ありがとう!

于 2016-06-17T07:04:17.987 に答える