动态代理类的详解

动态代理

什么是动态代理
在程序运行的过程中,动态创建出代理对象 , 我们可以对代理对象进行增强 , 对其方法进行增强。动态:在程序运行时 ,模式:你 ==>> 运营商(增强) ==>> 厂家,简单的说不需要在类的源码上改动,就能给类增强,让他够更强的功能

具体使用

/**
 * 创建一个接口
 */
public interface Car {
    public void run();//跑
    public void stop();//停
    public void jump();//跳

}
/**
 * 在创建一个实现类
 */
public class MyCar  implements  Car{
    @Override
    public void run() {
        System.out.println("跑");
    }

    @Override
    public void stop() {
        System.out.println("停");
    }

    @Override
    public void jump() {
        System.out.println("跳");
    }
}
/**
 * 测试动态代理的方法
 */
public class TestDemo {
    public static void main(String[] args) {
        /**
         * java.lang.reflect.Proxy  反射包==>> 运行时
         * Car proxyCar = Proxy.newProxyInstance(); 创建一个代理实例
         *
         * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
         * 参数1: 类加载器 : 将类加载到内存形成class对象
         *      动态创建一个类 相当于创建一个java文件 这个类不在内存 我们需要它加载到内存来
         *      固定格式:  当前类.class.getClassLoader();
         * 参数2: 动态创建的类 不知道方法 接口中有需要的方法名称
         *      固定格式:  子类的实例对象.getClass().getInterfaces()
         *      通过子类的字节码对象 获得所有的接口  相当于知道了子类实现过的所有方法
         *
         * 参数3:InvocationHandler 执行处理类
         *      动态创建的类只知道接口 方法名称 但是没有实现  执行处理类就是实现
         *InvocationHandler(){  public invoke (参数,参数,参数)}
         *  有一个invoke方法  invoke方法就是编写增强代码的位置
         *  invoke方法执行时机, 代理类每调用一次方法(任意) 执行处理类中的invoke将被执行一次
         * invoke的三个参数
         *  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
         *  代理类每调用一次方法(任意) 执行处理类中的invoke将被执行一次 同时 将传入三个参数
         *  参数1: 代理的对象(我们不用 底层会使用)
         *  参数2: 当前被执行的方法对象
         *  参数3: 当前被执行方法对象中的参数 如果有 以数组拼接 如果没有 就是null
         */
        //原来的汽车
        Car car = new MyCar();

        //新汽车
        Car proxyCar = (Car)Proxy.newProxyInstance(
                TestDemo.class.getClassLoader(),
                car.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //增强代码
                        if("jump".equals(method.getName())){
                            System.out.println("开始增强--飞");
                           method.invoke(car,args); //对方法进行增强后,放行原来的方法
                            return null;//在此处 return 表示后续的代码将不再运行 直接返回
                        }
                        //放行原来放法
                        method.invoke( car , args);//参数1:实例对象   参数2: 真实的参数

                        return null;
                    }
                }
        );

        proxyCar.run();
        proxyCar.jump();
        proxyCar.stop();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值