178 votes

Quelle est la différence entre le proxy dynamique JDK et CGLib?

Dans le cas du modèle de conception de proxy , quelle est la différence entre le proxy dynamique de JDK et les API de génération de code dynamique tierces telles que CGLib ?

Quelle est la différence entre les deux approches et quand faut-il en préférer une?

214voto

rparree Points 1170

Le proxy dynamique JDK peut uniquement utiliser un proxy par interface (votre classe cible doit donc implémenter une interface, qui sera également implémentée par la classe proxy).

CGLIB (et javassist) peuvent créer un proxy en sous-classant. Dans ce scénario, le proxy devient une sous-classe de la classe cible. Pas besoin d'interfaces.

Ainsi, les proxys dynamiques Java peuvent utiliser un proxy: public class Foo implements iFoo où CGLIB peut utiliser un proxy: public class Foo

67voto

raphw Points 6008

Les différences de fonctionnalités

  • Le JDK procurations permettent de mettre en œuvre tout un ensemble d'interfaces tout en sous-classement Object. Toute la méthode de l'interface, en plus d'Object::hashCode, Object::equals et Object::toString est ensuite transmis à un InvocationHandler.

  • cglib vous permet de mettre en œuvre tout un ensemble d'interfaces tout en sous-classement non-classe finale. Aussi, les méthodes peut être remplacé en option, c'est à dire pas tous les non-méthodes abstraites doivent être intercepté. En outre, il existe différentes façons de mettre en œuvre une méthode. Il propose également une InvocationHandler (de la classe dans un package différent), mais il permet aussi d'appeler super méthodes en utilisant les plus avancés intercepteurs comme par exemple un MethodInterceptor. En outre, cglib peut améliorer les performances par des interceptions comme FixedValue. Une fois, j'ai écrit un résumé de différents intercepteurs pour cglib.

Les différences de rendement

JDK procurations sont mis en œuvre plutôt naïvement qu'avec une seule interception répartiteur, l' MethodInterceptor. Cela nécessite une méthode virtuelle envoi d'une mise en œuvre qui ne peut pas toujours être insérée. Cglib permet de créer des octets de code ce qui peut parfois améliorer les performances. Voici quelques comparaisons pour la mise en œuvre d'une interface avec 18 stub méthodes:

            cglib                   JDK proxy
creation    804.000     (1.899)     973.650     (1.624)
invocation    0.002     (0.000)       0.005     (0.000)

Le temps est indiqué en nanosecondes avec un écart type entre accolades. Vous pouvez trouver plus de détails sur l'indice de référence en Octets Copain tutoriel, où Byte Buddy est un plus moderne alternative à cglib. Notez également que cglib n'est plus en développement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X