11
votes

Comment déballer l'objet d'origine d'un proxy dynamique

Quelle est la meilleure approche pour déballer un proxy dynamique pour récupérer l'objet d'origine en dessous? Le proxy dynamique a été créé en utilisant java.lang.reflect.proxy.newproxyinstance ()

merci.


4 commentaires

Cela dépend de la façon dont vous l'avez créée. Quelle bibliothèque? le proxy JDK? Ou cglib / javassist?


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


Cela suppose qu'il y a un objet original. Qu'est-ce que InvocationHandler est envoyé à newproxyinstance () ?


J'ai trouvé très utile Cette réponse sur un autre message . En outre, cette question est une quasi-dupliquée et il serait bon de fusionner les suggestions dans les deux IMHO


3 Réponses :


14
votes

Chaque proxy a un InvocationHandler associé à celui-ci. Seuls le InvocationHandler sait quel objet ( si un ) sous-tend le proxy. Si vous contrôlez la création du proxy, vous pouvez alors fournir votre propre invocation InvocationHandler qui aura la fonctionnalité supplémentaire que vous désirez (c'est-à-dire pour pouvoir divulguer l'objet sous-jacent.) Si vous ne le faites pas, Ensuite, j'ai peur que vous n'ayez pas de chance.


0 commentaires

0
votes

Vous pouvez utiliser la méthode proxy.getinVocationHandler (proxy) pour obtenir l'invocation d'origineHandler.


1 commentaires

Ce n'est pas l'objet emballé.



15
votes

Il n'y a pas de bonne méthode: proxy.getinVocationHandler (proxy) renvoie le gestionnaire, mais le problème consiste à extraire l'objet d'origine du gestionnaire. Si votre gestionnaire est une classe anonyme, le seul moyen d'extraire l'objet d'origine consiste à utiliser la réflexion et à extraire l'original de champ nommé Val $ quelque chose - méthode très laid. Un meilleur moyen est de créer une classe de manutention non anonyme avec un getter, puis vous faites:

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


0 commentaires