java 基于接口的动态代理

动态代理

特点
字节码随用随创建,随用随加载。 它与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。 装饰者模式就是静态代理的一种体现。

基于接口的动态代理

提供者:JDK 官方的 Proxy 类。
要求:被代理类最少实现一个接口。

案例

我们在购买电脑时一般是在当地电脑经销商购买,而经销商的电脑是从生产商进货而来的,经销商通过差价来盈利,比如一台电脑从厂家以4000元买进,6000元卖出。
java 基于接口的动态代理_第1张图片
在这个案例中,经销商就是代理对象,厂家就是被代理对象。

代码演示

IProxy接口

public interface IProxy {
    /**
     * 销售电脑
     * @param money 电脑价格
     */
    void salecomputer(float money);

    /**
     * 维修电脑
     */
    void repair_computer();
}

ProxyImpl实现类

public class ProxyImpl implements IProxy {
    @Override
    public void salecomputer(float money) {
        System.out.println("销售电脑,获得了"+money+"元钱");
    }
    @Override
    public void repair_computer()
    {
        System.out.println("电脑维修成功!");
    }
}

测试代码

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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

        final ProxyImpl proxyimpl = new ProxyImpl();
        /**
         * 代理:
         * 获取代理对象:    
         * 要求:
         *      被代理类最少实现一个接口
         * 创建的方式:
         * Proxy.newProxyInstance(三个参数)
         *      参数含义:
         *          ClassLoader:和被代理对象使用相同的类加载器。
         *          Interfaces:和被代理对象具有相同的行为。实现相同的接口。
         *          InvocationHandler:如何代理。
         * */
        IProxy proxyInstance = (IProxy)Proxy.newProxyInstance(proxyimpl.getClass().getClassLoader(), proxyimpl.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object returnvalue = null;
                if ("salecomputer".equals(method.getName())) {
                    Float money = (Float) args[0];
                    returnvalue = method.invoke(proxyimpl, money * 3/2);
                }
                return returnvalue;
            }
        });
        proxyInstance.salecomputer(4000f);
    }
}

执行结果如下:

销售电脑,获得了6000.0元钱

Process finished with exit code 0

以上就是今天分享的关于动态代理的内容了,希望大家能够有所收获,欢迎关注。

你可能感兴趣的:(java)