java基础回顾:动态代理

java基础回顾:动态代理_第1张图片
十字路口的夜景

代理,就是帮老板干事的人,例如代理卖房,代理租房等等。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文件,表示代理类。然后执行代理类的接口方法。跟静态代理相比,灵活度更高吧,例如接口如果新增了一个方法,代理类不用任意修改。

你可能感兴趣的:(java基础回顾:动态代理)