设计模式-09-代理模式-动态代理

面试被问到一次:动态代理的实现方式

    基于接口-----JDK动态代理
    基于类-------cglib
    java字节码实现: javalist
复制代码

需要重点了解的两个类 Proxy, InvocationHandler
proxy:提供创建动态代理类和实例的静态方法,由着些方法创建所有的动态代理类的超类!

与静态代理不同的是没有实际的代理对象;有一些固定的反射步骤来进行处理获得想要的结果

这一种根据代码中被代理的对象是接口,就知道是jkd动态代理

整个事情的任务--->就是为了打游戏!!!!!!!!!!!!!!!!

public interface Dayouxi {
    public  void  play();
}
复制代码
复制代码

我的任务,变得很简练

public class Wo implements Dayouxi{
    @Override
    public void play() {
        System.out.println("铂金到钻石!");
    }
}
复制代码
public class ProxyInvocationHand implements InvocationHandler {
    
    //被代理的接口
    private Dayouxi dyx;
    
    
    public void setWo(Dayouxi dyx){
        this.dyx=dyx;
    }
    
    //得到代理类
    public Object getProxy(){
    
    
    /*几个参数
        1.类加载器,通过反射获得
        2.接口, 反射获得
        3.InvocationHandler ,因为这个类继承了InvocationHandler,所以直接调用这个类就可以了。
    */
    
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), dyx.getClass().getInterfaces(),this);
    }
    
    //处理代理实类,并且返回结果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
        //动态代理的本质是:反射机制实现!!
        Object result = method.invoke(dyx, args);
        return result;
    }
}
复制代码

test实现

public class test {
    public static void main(String[] args) {

//        真实角色
        Wo wo=new Wo();

//        代理角色:还没有指定
        ProxyInvocationHand pih = new ProxyInvocationHand();
        //调用真实角色的接口:制定完毕
        pih.setWo(wo);

        Dayouxi proxy = (Dayouxi)pih.getProxy();
        proxy.play();


    }
}
复制代码

设计模式就先学习到这里!