Es gibt 2 Möglichkeiten, das MethodHandle für eine bestimmte Funktion zu erhalten.Was ist der Unterschied zwischen `lookup.unreflect()` und `lookup.findVirtual()`?
Methode 1
Method m = MyClass.class.getMethod("myMethod", String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().unreflect(m);
Methode 2
MethodType type = MethodType.methodType(void.class, String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().findVirtual(MyClass.class, "myMethod", type);
Was ist der Unterschied zwischen den beiden von ihnen?
konnte den letzten Punkt nicht verstehen. – wolfram77
['MethodHandle.invokeExact'] (http://docs.oracle.com/javase/8/docs/api/java/lang/invoke/MethodHandle.html#invokeExact-java.lang.Object...-) kann mit beliebigen Argumenten aufgerufen werden, die mit der zugrunde liegenden Zielmethode übereinstimmen müssen. Sie können also 'lookup(). FindVirtual (MethodHandle.class," invokeExact ", arbitraryType) verwenden, um das gleiche zu tun. Im Gegensatz dazu funktioniert 'MethodHandle.class .getMethod (" invokeExact ", ...)' nur mit 'Object []. Class' als Argument, und das Aufrufen desselben erzeugt immer eine' UnsupportedOperationException'. – Holger
ging über meinen Kopf @Holger (ich bin neu in der Reflexion). Aber, danke für die Antwort. 'unreflect' scheint eine gute Wahl zu sein, da ich auch mit statischen Methoden arbeiten möchte. (Warum würden Sie 'findVirtual' auf' MethodHandle' selbst verwenden?) – wolfram77