Une brève introduction à InvocationHandler du proxy dynamique Java
Cet article vous apporte une brève introduction au proxy dynamique InvocationHandler. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Il existe des articles très détaillés sur Internet sur les concepts de proxy dynamique, de proxy et d'InvocationHandler de Java. En fait, ces concepts ne sont pas si compliqués. Nous comprenons maintenant ce qu'est InvocationHandler à travers l'exemple le plus simple. Il convient de mentionner qu'InvocationHandler est largement utilisé dans la mise en œuvre du framework Spring, ce qui signifie que si nous comprenons parfaitement InvocationHandler, nous jetterons une base solide pour l'apprentissage futur du code source Spring.
Développer une interface qui contient deux méthodes pour saluer « bonjour » ou « au revoir » à des personnes spécifiées.
public interface IHello { void sayHello(String name); void sayGoogBye(String name); }
Créez une classe simple pour implémenter l'interface IHello.
public class Helloimplements implements IHello { @Override public void sayHello(String name) { System.out.println("Hello " + name); } @Override public void sayGoogBye(String name) { System.out.println(name+" GoodBye!"); } }
Consommer cette classe d'implémentation n'a rien de spécial jusqu'à présent.
Supposons maintenant que nous recevions cette exigence : le patron exige que chaque fois que la classe d'implémentation salue quelqu'un, les détails de la salutation soient enregistrés dans un fichier journal. Par souci de simplicité, nous imprimons la ligne d'instruction suivante avant de saluer pour simuler l'action de journalisation.
System.out.println("问候之前的日志记录...");
Vous pourriez dire, n’est-ce pas simple ? Modifiez directement la méthode correspondante de Helloimplements et insérez cette ligne de log dans la méthode correspondante.
Cependant, la demande du patron est la suivante : vous n'êtes pas autorisé à modifier la classe Helloimplements d'origine. Dans des scénarios réels, Helloimplements peut être fourni par un package jar tiers et nous n'avons aucun moyen de modifier le code.
Vous pouvez dire que nous pouvons utiliser le modèle de proxy dans le modèle de conception, c'est-à-dire créer une nouvelle classe Java en tant que classe proxy, et implémentez également l'interface IHello, puis transmettez une instance de la classe Helloimplements dans la classe proxy. Bien que nous soyons tenus de ne pas modifier le code de Helloimplements, nous pouvons écrire le code de journalisation dans la classe proxy. Le code complet est le suivant :
public class StaticProxy implements IHello { private IHello iHello; public void setImpl(IHello impl){ this.iHello = impl; } @Override public void sayHello(String name) { System.out.println("问候之前的日志记录..."); iHello.sayHello(name); } @Override public void sayGoogBye(String name) { System.out.println("问候之前的日志记录..."); iHello.sayGoogBye(name); } static public void main(String[] arg) { Helloimplements hello = new Helloimplements(); StaticProxy proxy = new StaticProxy(); proxy.setImpl(hello); proxy.sayHello("Jerry"); } }
Cette approche peut répondre aux exigences :
Voyons comment utiliser InvocationHandler pour obtenir le même effet.
InvocationHandler是一个JDK提供的标准接口。看下面的代码: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynaProxyHello implements InvocationHandler { private Object delegate; public Object bind(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance( this.delegate.getClass().getClassLoader(), this.delegate .getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { System.out.println("问候之前的日志记录..."); // JVM通过这条语句执行原来的方法(反射机制) result = method.invoke(this.delegate, args); } catch (Exception e) { e.printStackTrace(); } return result; }
La méthode de liaison dans le code ci-dessus est très similaire à la méthode setImpl de ma précédente classe proxy StaticProxy, mais le type de paramètre d'entrée de cette méthode de liaison est plus universel. Le code de journalisation est écrit dans la méthode Invocation.
Découvrez comment l'utiliser :
static public void main(String[] arg) { DynaProxyHello helloproxy = new DynaProxyHello(); Helloimplements hello = new Helloimplements(); IHello ihello = (IHello) helloproxy.bind(hello); ihello.sayHello("Jerry"); }
L'effet d'exécution est exactement le même que celui de la solution StaticProxy.
Déboguons-le d’abord. Lorsque la méthode bind est exécutée, la méthode Proxy.newProxyInstance est appelée et l'instance de la classe Helloimplements est transmise.
On observe la variable ihello renvoyée par l'instruction IHello ihello = (IHello) helloproxy.bind(hello) dans le débogueur. Bien que son type statique soit IHello, veuillez noter que lorsque vous observez son type réel dans le débogueur, il ne s'agit pas d'une instance de Helloimplements, mais de ce que la JVM a traité pour nous, y compris la ligne de journal que nous avons écrite à la main dans la méthode d'invocation. code. Le type ihello est $Proxy0.
Lorsque la méthode sayHello de cette variable traitée par la JVM est appelée, la JVM transfère automatiquement l'appel à DynaProxyHello.invoke :
Ainsi, dans la méthode d'invocation, notre code de journalisation manuscrit est exécuté, puis le code sayHello original est exécuté via la réflexion Java.
Certains amis peuvent se demander : votre InvocationHandler semble-t-il plus compliqué que le proxy statique StaticProxy ? Quels sont les avantages ?
Supposons que les besoins du patron ont encore changé et que différentes stratégies de journalisation doivent être utilisées lors de l'appel des méthodes de salutation et de dire au revoir.
Voyons comment utiliser InvocationHandler pour l'implémenter avec élégance :
J'espère que cet exemple pourra donner à chacun une compréhension de la dynamique de Java proxy InvocationHandler Obtenez la compréhension la plus élémentaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo
