Maison  >  Article  >  Java  >  Introduction aux méthodes d'implémentation du proxy dynamique JAVA et du mode CGLIB (exemple de code)

Introduction aux méthodes d'implémentation du proxy dynamique JAVA et du mode CGLIB (exemple de code)

不言
不言avant
2019-03-19 10:06:212904parcourir

Ce que cet article vous apporte, c'est une introduction aux méthodes d'implémentation du proxy dynamique JAVA et du mode CGLIB (exemples de code). J'espère que les amis dans le besoin pourront s'y référer. Cela vous aidera.

Le proxy dynamique est une technologie qui utilise la technologie de réflexion et de bytecode pour créer une sous-classe d'une interface ou d'une classe spécifiée (proxy dynamique) et son objet d'instance au moment de l'exécution. Grâce à cette technologie, le code peut être amélioré de manière non invasive (. recommandé : Tutoriel Java)

Introduction aux méthodes dimplémentation du proxy dynamique JAVA et du mode CGLIB (exemple de code)

Proxy : Proxy est la classe parent de tous les proxys dynamiques, qui fournit une méthode statique pour créer un proxy dynamique. Objets de classe et instances ;
InvocationHandler : chaque instance de proxy dynamique a un InvocationHandler associé. Lorsqu'une méthode est appelée sur une instance de proxy, l'appel de méthode sera transmis à la méthode d'invocation d'InvocationHandler

1.implémentation du proxy dynamique Java

//java的代理模式必须有一个interface的接口方法
public interface ItemService {
    void sayHello();
}

public class ItemServiceImpl implements ItemService {
    @Override
    public void sayHello() {
        System.out.println("hello world~");
    }
}

//代理类 
public class MyInvocationHandler implements InvocationHandler {

    private Object realObject;

    public void setRealObject(Object realObject) {
        this.realObject = realObject;
    }

    public Object getRealObject() {
        return realObject;
    }

    public MyInvocationHandler(Object realObject){
        super();
        this.realObject=realObject;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before running ~~");
        Object ret=method.invoke(realObject,args);
        System.out.println("after running ~~~");
        return ret;
    }
}

// 实现类
public class main {
    public static void main(String[] args) {
        ItemService itemService=new ItemServiceImpl();
        MyInvocationHandler handler=new MyInvocationHandler(itemService);
        ItemService proxy= (ItemService) Proxy.newProxyInstance(itemService.getClass().getClassLoader(),itemService.getClass().getInterfaces(),handler);
        proxy.sayHello();
    }
}

2.implémentation CGLIB

CGLIB (Code Generation Library) est une bibliothèque de génération de bytecode basée sur ASM qui nous permet de modifier et de générer dynamiquement du bytecode au moment de l'exécution. CGLIB implémente le proxy par héritage ;
Enhancer : pour spécifier l'objet cible à proxy et l'objet qui gère réellement la logique du proxy. Enfin, l'objet proxy est obtenu en appelant la méthode create(). sur cet objet sera transmis à MethodInterceptor ;
MethodInterceptor : les appels de méthode des objets proxy dynamiques seront transmis à la méthode d'interception pour amélioration ;

//1.需要引入
 <dependency>
    <groupid>cglib</groupid>
    <artifactid>cglib</artifactid>
    <version>3.2.6</version>
 </dependency>
//2.方法
public class ItemServiceImpl {
    void sayHello(String name) {
        System.out.println("hello world~"+name);
    }
}

//3.cglib代理实现类
public class MyInterceptor implements MethodInterceptor {

    private Object realObject;

    public void setRealObject(Object realObject) {
        this.realObject = realObject;
    }

    public Object getRealObject() {
        return realObject;
    }

    public MyInterceptor(Object realObject){
        this.realObject=realObject;
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before running ~~");
        System.out.println(method);
        System.out.println(Arrays.toString(objects));
        Object ret=methodProxy.invoke(realObject,objects);
        System.out.println("after running ~~");
        return ret;
    }
}
//4.实现类
public class main {
    public static void main(String[] args) {

        ItemServiceImpl itemService=new ItemServiceImpl();

        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(ItemServiceImpl.class);
        enhancer.setCallback(new MyInterceptor(itemService));
        ItemServiceImpl imp= (ItemServiceImpl) enhancer.create();
        imp.sayHello("张三");

    }
}

Résumé :
Le proxy dynamique natif JDK est nativement pris en charge par Java et ne nécessite aucune dépendance externe, mais il ne peut que proxy basé sur des interfaces
Proxies CGLIB par héritage, que l'objet cible implémente l'interface ou non, il peut proxy, mais il ne peut pas gérer la situation finale


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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer