代理,就是帮老板干事的人,例如代理卖房,代理租房等等。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开始卖房
}
}
运行结果
基本原理:动态生成一个字节码class文件,表示代理类。然后执行代理类的接口方法。跟静态代理相比,灵活度更高吧,例如接口如果新增了一个方法,代理类不用任意修改。