十字路口的夜景
代理,就是幫老板干事的人,例如代理賣房,代理租房等等。java代理分動態和靜態。
靜態:手動寫一個java文件,表示代理類,寫死了。
動態:jvm動態幫你新建一個class文件,你只需要寫幾行代碼就行,靈活度更高。
以深圳地主賣房子的過程為例,角色有地主,中介。地主假設為王健林,中介是一個小mm。
地主和中介都實現Business的接口,都是生意人嘛,Business的接口方法就是賣房子啦。
public interface Business {
public void sell();
}
地主類:
public class Landlord implements Business {
public void sell () {
System.out .println( "I am Landlord,I sell my house" );
}
}
中介類:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class AgencyHandler implements InvocationHandler{
private Landlord mLandlord;
public AgencyHandler(Landlord mLandlord){
this.mLandlord=mLandlord;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("Boss,I has find a man want you house");
//代理做一些預處理
method.invoke(mLandlord, args);//地主真正賣房
System.out.println("Boss,Congralation!"); //代理處理一些后事
return null;
}
}
在深圳的CBD-main函數開始交易
import java.lang.reflect.Proxy;
public class ShenZhen {
public static void main(String[] args) {
Landlord wangjianlin=new Landlord(); //實例化大富豪王健林
Business mmAgency = (Business)Proxy.newProxyInstance(Business.class.getClassLoader(), wangjianlin
.getClass().getInterfaces(), new AgencyHandler(wangjianlin)); //實例化中介mm
System.out.println(mmAgency.getClass().getName());
mmAgency.sell(); //mm開始賣房
}
}
運行結果
運行結果.png
基本原理:動態生成一個字節碼class文件,表示代理類。然后執行代理類的接口方法。跟靜態代理相比,靈活度更高吧,例如接口如果新增了一個方法,代理類不用任意修改。