Maison Java javaDidacticiel Une brève introduction à InvocationHandler du proxy dynamique Java

Une brève introduction à InvocationHandler du proxy dynamique Java

Oct 22, 2018 pm 03:47 PM
java javascript jdk8 代理

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);
}
Copier après la connexion

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!");
    }
}
Copier après la connexion

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("问候之前的日志记录...");
Copier après la connexion

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.

Une brève introduction à InvocationHandler du proxy dynamique Java

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.

Une brève introduction à InvocationHandler du proxy dynamique Java

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");

  }

}
Copier après la connexion

Cette approche peut répondre aux exigences :

Une brève introduction à InvocationHandler du proxy dynamique Java

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;
    }
Copier après la connexion

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");
}
Copier après la connexion

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.

Une brève introduction à InvocationHandler du proxy dynamique Java

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.

Une brève introduction à InvocationHandler du proxy dynamique Java

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 :

Une brève introduction à InvocationHandler du proxy dynamique Java

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 :

Une brève introduction à InvocationHandler du proxy dynamique Java

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

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.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

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.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

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.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

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.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

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

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

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.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

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

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

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

See all articles