In Kürze: 1. Ich habe eine letzte Klasse, die ich für einen dynamischen Proxy erstellen möchte. Wie kann ich es tun? 2. Kann ich MethodHandle in Method umwandeln?Wie kann ich einen dynamischen Proxy für die letzte Klasse erstellen?
Details Zuallererst existiert eine API, um MethodHandle in Method zu konvertieren? So etwas wie in java.lang.invoke.MethodHandles
public MethodHandle unreflect(Method m) throws IllegalAccessException;
aber die entgegengesetzte Weise arrond?
Sagen wir, ich möchte dynamische java.lang.reflect.Method erstellen. Es wird defiend als
public final
class Method extends AccessibleObject implements GenericDeclaration,
Member ;
Also, wenn ich Dynamische JDK-Proxy verwenden will, muß ich eine Schnittstelle (Mitglied zum Beispiel) verwenden. Es gibt jedoch 2 Haupt-Drawabacks. Als erstes Verfahren wie
public Class<?>[] getParameterTypes();
und wie
public Class<?> getReturnType();
ist nicht Teil einer Schnittstelle, während sie ausgiebig verwendet werden.
Der zweite Nachteil ist, dass es keinen Drop-In-Ersatz bietet. Das heißt, ich kann meinen dynamischen Proxy nicht an den Code übergeben, der java.lang.reflect.Method erwartet.
Ein anderer Ansatz ist die Verwendung von CGLIB oder Javaassist. AFAIK, CGLIB kann die letzte Klasse nicht vermitteln, oder? Kann Javaassist die letzte Klasse beenden? Wie kann ich den endgültigen Bezeichner aus der Klasse entfernen? AFAIL, Javvassist kann es irgendwie tun ...
könnten Sie die letzte Option näher erläutern? – piotrek
Sie können Klassen mithilfe der Instrumentierungs-API neu definieren. Sagen wir, eine Klasse definiert eine Methode foo. Sie können die Methodenleiste umbenennen und von Ihrer neu definierten Methode foo aus aufrufen –