4.利用JDK提供的动态代理来代理接口

创建代理类

//JDK 提供的动态代理 ,只能代理接口 ,不能代理类 。cglib 能代理类 。
public class DynamicProxy implements InvocationHandler{

    //声明一个对象 ,这个对象 就是用来表示 被代理类 。
    private Object obj;
    //传入被代理对象 。
    public Object getProxy(Object obj){
        this.obj = obj;
        //生成代理对象 。
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        check();
        beforeLogging();
        Object returnValue = method.invoke(obj, args);
        afterLoggging();
        return returnValue;
    }

    public void beforeLogging(){
        System.out.println("事前日志 。");
    }
    public void afterLoggging(){
        System.out.println("事后日志。");
    }
    public void check(){
        System.out.println("安全检查。");
    }
    
}

obj.getClass().getClassLoader():拿到对象所有的加载器
obj.getClass().getInterfaces():拿到对象所有的构造器

定义两个接口,并为其创建实体类

public class PanMeiNv implements MeiNv {

    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("和潘美女玩 。。。");
    }

}
@Override
    public void mai() {
        // TODO Auto-generated method stub
        System.out.println("上海的房子要卖。2亿。");
    }

定义一个主方法

public static void main(String[] args) {
        //创建被代理对象
        //PanMeiNv pan = new PanMeiNv();
        //创建代理类.
        /*DynamicProxy dp = new DynamicProxy();
         *通过getProxy方法拿到代理对象.
         *object proxy = dp.getProxy(pan);
         *把代理对象强转成美女类型.
         *MeiNv mv = (MeiNv)proxy;
         *mv.play();
         * 
         * */
        
        //流程痕迹
        
        //创建被代理对象
        ShangHaiFang sh = new ShangHaiFang();
        DynamicProxy dp = new DynamicProxy();
        Object proxy = dp.getProxy(sh);
        Fang f = (Fang) proxy;
        f.mai();
    }
}

输出结果:

安全检查。
事前日志 。
上海的房子要卖。2亿。
事后日志。

你可能感兴趣的:(4.利用JDK提供的动态代理来代理接口)