把上个案例进行修改
- 实现动态代理接口:
public class Agencey implements InvocationHandler{
- 编写set货源方法
private Insurance sellFamily; public Agencey(Insurance s) { sellFamily = s; }
- 使用proxy创建代理类
public Object getobject() { //参数:代理类的类加载器, 代理接口, InvocationHandler接口,因为本类实现了,所以为this return Proxy.newProxyInstance((this.getClass().getClassLoader(),sellFamily.getClass().getInterfaces(),this); }
- 利用接口实现方法, 调用代理方法, 这里就类似于静态代理的 sellFamily.sellinsurance()
invoke是被重写的,所以会在调用getobject()方法后,创建了这个代理,
这个代理里面就包含现在的invoke()方
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//于是乎这里就可以做代理商想做的事情了!如:
System.out.println("动态代理收了80w的代理费,已经跑路了....");
// 参数:真实买家,方法名称
return method.invoke(sellFamily,args);//调用方法并返回结果
}
- 客户使用:
最后,万能动态代理工具:
public class DynamicProxy implements InvocationHandler {
//原主人 接口
Object master;
//获取代理商
public Object getDynamicProxy(Object master){
//设置原主人
this.master = master;
return Proxy.newProxyInstance(this.getClass().getClassLoader(),master.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//.....可以添加代理内容
Object invoke = method.invoke(master, args);
return invoke;
}
}
调用:
@Test
public void testz(){
//真实卖家
Insurances insuranceImpls = new InsuranceImpls();
//代理商(货源) //初始化代理商,现在卖家就被这个类代理了,就可以走到invoke里了
Insurances dynamicProxy = (Insurances)new DynamicProxy().getDynamicProxy(insuranceImpls);
//买到房子
dynamicProxy.SellInsurance();
}
10/07/2023 3:57:45 PM