Mode proxy --- proxy dynamique --cglib

Comme mentionné la dernière fois, cglib est un proxy dynamique basé sur les classes.

Le proxy jdk étant basé sur des interfaces, il a des limites. Si une classe n'hérite pas de l'interface et souhaite implémenter un proxy dynamique, elle doit utiliser le proxy dynamique cglib. Par rapport aux proxys JDK, le principe de cglib est de créer une sous-classe pour remplacer la méthode de la classe parent (l'objet à proxyer).

processus cglib

Rôle réel : l'objet à proxyer

Rôle proxy : générer une classe proxy (pour hériter de l'interface MethodInterceptor dans le package cglib) intercepteur de méthode

public interface MethodInterceptor extends Callback {
    Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}

Le premier paramètre est une référence à l'objet proxy, le deuxième paramètre est une référence à la méthode correspondante, le troisième paramètre correspondant et le quatrième est le proxy de la sous-classe. Cette méthode est la méthode de base pour le traitement des méthodes d'instance et est utilisée pour implémenter la fonction de code d'amélioration d'objet proxy, qui est similaire à Invocation() du proxy jdk.

De plus, la génération des instances d'objet proxy dépend d'une classe Enhancer, qui possède de nombreuses API. La plus couramment utilisée est le code suivant

    public Object getTarget() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

définir la classe parent, qui est la classe à proxy,

Ensuite, à l'intérieur de setcallback se trouve la classe qui implémente l'intercepteur lui-même

Puis retournez Enhancer.create() récupère une instance d'un objet

rôle du client : le rôle de l'agent appelant

Les codes sont affichés ci-dessous

Personnage réel :

package com.heaboy.proxyExcise.cglibProxy;

/**
 * @Author:XK
 * @Date: Created in 17:34 2022/2/19
 * @Description:
 **/
public class Student {
    public void run(){
        System.out.println("学生会跑");
    }
}

Rôle d'agent :

package com.heaboy.proxyExcise.cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.springframework.cglib.core.MethodInfoTransformer;

import java.lang.reflect.Method;

/**
 * @Author:XK
 * @Date: Created in 17:34 2022/2/19
 * @Description:
 **/
public class cglibProxyIm implements MethodInterceptor {
    //要代理的类
    private Object target;

    public cglibProxyIm(Object target){
        this.target=target;
    }

    public Object getTarget() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("增强代码1");
        //方式1
        //Object result =methodProxy.invokeSuper(o,objects);
        //方式2
        Object result = method.invoke(target, objects);
        System.out.println("增加功能2");
        return result;
    }
}

rôle du client :

package com.heaboy.proxyExcise.cglibProxy;

/**
 * @Author:XK
 * @Date: Created in 17:40 2022/2/19
 * @Description:
 **/
public class client {
    public static void main(String[] args) {
        Student student = new Student();
        cglibProxyIm cglibProxyIm = new cglibProxyIm(student);
        Student target = (Student)cglibProxyIm.getTarget();
        target.run();
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/Yoke______/article/details/123021720
conseillé
Classement