Heim >Java >javaLernprogramm >Was ist ein dynamischer Java-Proxy und wie wird er implementiert?
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.
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:
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);
🎜@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!