静态代理,动态代理---笔记

来源:互联网 发布:小指头结局 知乎 编辑:程序博客网 时间:2024/06/06 20:12
  • 静态代理

例如租房子。

public interface Leasing {    public String doLeasing(String name,long money);}

一般实现类

public class LeasingImpl implements Leasing {    public String doLeasing(String name ,long money)    {        return name+"租到房,价格:"+money;    }}

中介的实现类

public class PreoxyLeasing implements Leasing {    LeasingImpl mLeasImpl;    public PreoxyLeasing( LeasingImpl mLeasImpl) {        this.mLeasImpl =mLeasImpl;    }    @Override    public String doLeasing(String name,long money) {       getMoeyFromUser();        System.out.println("用户多花了"+(money/2));        getMoeyFromHouser();        System.out.println("房东多花了"+(money/2));        return name+"中介帮忙租到房子 价格:"+money;    }    public void getMoeyFromUser() {        System.out.println("收取用户的一半租金");    }    public void getMoeyFromHouser() {        System.out.println("收取房东的一半租金");    }}

租客自己租房。

 Leasing mLeas = new LeasingImpl();        System.out.println(mLeas.doLeasing("自己",1000l));

租客通过中介来租房

  Leasing mLeas = new LeasingImpl();    mLeas = new PreoxyLeasing(new LeasingImpl()); System.out.println(mLeas.doLeasing("中介",1000l));
  • 动态代理。

首先实现InvocationHandler接口,处理invoke方法,使用动态代理,调用每个方法都会执行invoke方法。

public class LeasingHandler implements InvocationHandler {    Object mBase;    public LeasingHandler(Object mBase) {        this.mBase = mBase;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //拦截方法        if("doLeasing".equals(method.getName()))        {            {                System.out.println("收用户一半的房租");                System.out.println("收房主一半的房租");                Long money = (Long) args[1];                money +=money/2;                // 帮忙租房子                String things = (String) method.invoke(mBase,args[0], money);                return things;            }        }        return null;    }}
0 0