Heim  >  Artikel  >  Java  >  Einführung in die Implementierungsmethoden des dynamischen JAVA-Proxys und des CGLIB-Modus (Codebeispiel)

Einführung in die Implementierungsmethoden des dynamischen JAVA-Proxys und des CGLIB-Modus (Codebeispiel)

不言
不言nach vorne
2019-03-19 10:06:212904Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Implementierungsmethoden des JAVA-Dynamik-Proxys und des CGLIB-Modus (ich hoffe, er hat einen gewissen Referenzwert). Es wird Ihnen helfen.

Dynamischer Proxy ist eine Technologie, die Reflexions- und Bytecode-Technologie verwendet, um zur Laufzeit eine Unterklasse einer bestimmten Schnittstelle oder Klasse (dynamischer Proxy) und ihres Instanzobjekts zu erstellen. Durch diese Technologie kann Code nicht-invasiv verbessert werden ( Empfohlen: Java-Tutorial)

Einführung in die Implementierungsmethoden des dynamischen JAVA-Proxys und des CGLIB-Modus (Codebeispiel)

Proxy: Proxy ist die übergeordnete Klasse aller dynamischen Proxys, die eine statische Methode zum Erstellen dynamischer Proxy-Klassenobjekte bereitstellt und Instanzen;
InvocationHandler: Jeder dynamischen Proxy-Instanz ist ein InvocationHandler zugeordnet. Wenn eine Methode auf einer Proxy-Instanz aufgerufen wird, wird der Methodenaufruf an die Aufrufmethode von InvocationHandler

1.java dynamische Proxy-Implementierung

//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.CGLIB-Implementierung

CGLIB (Code Generation Library) ist eine ASM-basierte Bytecode-Generierungsbibliothek, die es uns ermöglicht, Bytecode zur Laufzeit zu ändern und dynamisch zu generieren. CGLIB implementiert Proxy durch Vererbung;

Enhancer: um das Zielobjekt anzugeben, das tatsächlich die Proxy-Logik verarbeitet, wird das Proxy-Objekt durch Aufrufen aller nicht endgültigen Methodenaufrufe abgerufen Dieses Objekt wird an MethodInterceptor weitergeleitet Java erfordert keine externen Abhängigkeiten, kann jedoch nur auf Schnittstellen basierende Proxys erstellen. CGLIB-Proxys werden durch Vererbung bereitgestellt. Unabhängig davon, ob das Zielobjekt die Schnittstelle implementiert oder nicht, kann es Proxys erstellen, die endgültige Situation jedoch nicht verarbeiten


Das obige ist der detaillierte Inhalt vonEinführung in die Implementierungsmethoden des dynamischen JAVA-Proxys und des CGLIB-Modus (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen