2010-12-10 9 views
5

Was ist der beste Ansatz zum Entpacken eines dynamischen Proxy zum Abrufen des ursprünglichen Objekts darunter? Der dynamische Proxy wurde erstellt mit java.lang.reflect.Proxy.newProxyInstance()So entpacken Sie das ursprüngliche Objekt aus einem dynamischen Proxy

Vielen Dank.

+0

es hängt davon ab, wie Sie es erstellt haben. Welche Bibliothek? der JDK-Proxy? Oder CGLIB/Javassist? – Bozho

+0

@Bozho: Ich habe die Frage aktualisiert, um genauer zu sein – MRalwasser

+0

Dies setzt voraus, dass es ein Originalobjekt gibt. Was 'InvocationHandler' an 'newProxyInstance()' gesendet wird? –

Antwort

8

Jedem Proxy ist ein InvocationHandler zugeordnet. Nur der InvocationHandler weiß, welches Objekt (falls) dem Proxy zugrunde liegt. Wenn Sie die Erstellung des Proxys kontrollieren, können Sie Ihre eigenen InvocationHandler liefern, die die zusätzliche Funktionalität haben, die Sie wünschen (dh in der Lage sein wird, das zugrundeliegende Objekt zu offenbaren.) Wenn Sie das nicht tun, dann fürchte ich Sie kein Glück.

1

Sie können die Proxy.getInvocationHandler (Proxy) -Methode verwenden, um den ursprünglichen InvocationHandler zu erhalten.

+4

zusammenzuführen. Das ist nicht das umhüllte Objekt. –

8

Es gibt keine gute Methode: Proxy.getInvocationHandler (Proxy) gibt Handler zurück, aber das Problem besteht darin, das ursprüngliche Objekt aus dem Handler zu extrahieren. Wenn Ihr Handler eine anonyme Klasse ist, besteht die einzige Möglichkeit zum Extrahieren des ursprünglichen Objekts darin, die Reflektion zu verwenden und das Original aus dem Feld namens val $ something zu extrahieren - eine sehr hässliche Methode. besserer Weg ist, nicht-anonymen-Handler-Klasse mit einem Getter zu erstellen, dann Sie tun:

((YourHandler)Proxy.getInvocationHandler(proxy)).getOriginalObject()