2010-12-10 31 views
5

quelle est la meilleure approche pour déballer un proxy dynamique pour récupérer l'objet original sous? Le proxy dynamique a été créé en utilisant java.lang.reflect.Proxy.newProxyInstance()Comment déballez l'objet original d'un proxy dynamique

Merci.

+0

cela dépend comment vous l'avez créé. Quelle bibliothèque? le proxy JDK? Ou CGLIB/Javassist? – Bozho

+0

@Bozho: J'ai mis à jour la question pour être plus précis – MRalwasser

+0

Cela suppose qu'il y a un objet original. Quel 'InvocationHandler' est envoyé à' newProxyInstance() '? –

Répondre

8

Chaque proxy a une InvocationHandler qui lui est associée. Seul le InvocationHandler sait quel objet (s'il existe) sous-tend le proxy. Si vous contrôlez la création du proxy, alors vous pouvez fournir votre propre InvocationHandler qui aura la fonctionnalité supplémentaire que vous désirez (c'est-à-dire sera en mesure de divulguer l'objet sous-jacent.) Si vous ne le faites pas, j'ai peur que vous pas de chance.

1

Vous pouvez utiliser la méthode Proxy.getInvocationHandler (proxy) pour obtenir le InvocationHandler d'origine.

+4

Ce n'est pas l'objet enveloppé. –

8

Il n'y a pas de bonne méthode: Proxy.getInvocationHandler (proxy) retourne gestionnaire, mais le problème est d'extraire l'objet d'origine du gestionnaire. Si votre gestionnaire est une classe anonyme, la seule façon d'extraire l'objet original est d'utiliser la réflexion et d'extraire l'original du champ nommé val $ something - méthode très laide. Une meilleure façon est de créer la classe de gestionnaire non anonyme avec un getter, alors vous faites:

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