Heim  >  Artikel  >  Java  >  Was ist ein dynamischer Java-Proxy und wie wird er implementiert?

Was ist ein dynamischer Java-Proxy und wie wird er implementiert?

WBOY
WBOYnach vorne
2023-05-02 16:55:151077Durchsuche

1. Proxy-Modus

Wenn wir eine Methode einer bestimmten Klasse (bestimmte Implementierungsklasse) aufrufen müssen, erstellen wir nicht direkt ein Objekt dieser Klasse, sondern rufen das Proxy-Klassenobjekt der Klasse ab und rufen die spezifische Implementierung auf Klasse über die Proxy-Objektfunktion. Sowohl die konkrete Implementierungsklasse als auch die Proxy-Klasse implementieren dieselbe Schnittstelle, und die Proxy-Klasse enthält das Objekt der Implementierungsklasse. Dadurch entsteht eine Isolationsschicht zwischen dem aufrufenden Ende und dem spezifischen Implementierungsende, um eine direkte Interaktion zu vermeiden.

In der Realität gibt es viele ähnliche Beispiele für das Agenturmodell. Wenn wir beispielsweise ein Haus kaufen oder mieten, müssen wir einen Vermittler beauftragen.

2. Statische Proxy-Implementierung

1) Schnittstelle definieren:

public interface IHouse {
    void sallHouse();
    int sallHouse2();
}

2) Spezifische Implementierungsklasse:

public class Andy implements IHouse {
    @Override
    public void sallHouse() {
        System.out.println("andy sall house..");
    }
    @Override
    public int sallHouse2() {
        return 100;
    }
}

4) Client-Aufruf:

public class HouseProxy implements IHouse {
    Andy andy;
    public HouseProxy(Andy andy) {
        this.andy = andy;
    }
    @Override
    public void sallHouse() {
        andy.sallHouse();
    }
    @Override
    public int sallHouse2() {
        return andy.sallHouse2();
    }
}

Dynamische Proxy-Analyse:

1) IHouse iHouse = (IHouse) Proxy.newProxyInstance(); Erstellen Sie ein dynamisches Proxy-Objekt,

hat drei Parameter:

1.ClassLoader KlassenladerIHouse iHouse = (IHouse) Proxy.newProxyInstance();创建动态代理对象,

有三个参数:

1.ClassLoader 类加载器

2.被代理接口的Class类,

3.InvocationHandler接口实现类

2)拿到iHouse动态代理后,调用接口的方法iHouse.sallHouse();

这个方法一被调用,就会执行InvocationHandler类中invoke方法。

@Override

public Object invoke(Object o, Method method, Object[] objects) throws Throwable {

//通过反射调用被代理对象的方法

return method.invoke(andy, objects);

}

invoke方法有三个参数:

method,就是代理类调用的方法名(sallHouse)

objects,就是代理类调用方法时传递的参数。

Object obj = method.invoke(andy, objects);

2 . Klassenklasse der Proxy-Schnittstelle,

3.InvocationHandler-Schnittstellenimplementierungsklasse🎜🎜2) Nachdem Sie den dynamischen iHouse-Proxy erhalten haben, rufen Sie die Schnittstellenmethode iHouse.sallHouse();🎜🎜Sobald diese Methode aufgerufen wird, wird die InvocationHandler-Klasse ausgeführt Methode aufrufen. 🎜
🎜@Override🎜🎜public Object invoke(Object o, Method method, Object[] Objekte) throws Throwable {🎜🎜//Rufe die Methode des Proxy-Objekts durch Reflexion auf🎜🎜return method.invoke(andy, Objekte ). Verfahren. 🎜🎜Object obj = method.invoke(andy, Objekte); Rufen Sie das andy-Objekt über den Reflexionsmechanismus auf, die entsprechende Methode im spezifischen Implementierer. 🎜🎜Sein Rückgabewert kann empfangen werden, wenn das Proxy-Objekt die Schnittstelle aufruft. Unabhängig vom Typ wird dieser Typ zurückgegeben. Das ist es, was Retrofit macht🎜

Das obige ist der detaillierte Inhalt vonWas ist ein dynamischer Java-Proxy und wie wird er implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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