代理模式之:动态代理

什么是代理模式

​   ProxyPattern(即:代理模式),23种常用的面向对象软件的设计模式之一

​   代理模式: 静态代理(和装饰者很像), 动态代理

   代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

什么是动态代理

  动态代理它可以直接给某一个目标(被代理 对象)对象(实现了某个或者某些接口)生成一个代理对象,而不需要代理类存在。

​  动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象

动态代理的作用

 jvm通过反射的方式创建出来的代理对象,对目标方法进行增强

 jdk中动态代理的使用

Java.lang.reflect.Proxy类可以直接生成一个代理对象

  • Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)生成一个代理对象

    • 参数1:ClassLoader loader 代理对象的类加载器           一般使用被代理对象的类加载器

    • 参数2:Class<?>[] interfaces 代理对象的要实现的接口     一般使用的被代理对象实现的接口

    • 参数3:InvocationHandler h (接口)执行处理类

  • InvocationHandler中的invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行

    • 参数1:代理对象

    • 参数2:当前执行的方法

    • 参数3:当前执行的方法运行时传递过来的参数

      • 返回值:是当前代理对象所执行的方法的返回值

        public interface Car {
        
            void run();
            void stop();
            String  addOil(int num);
        }
        

          汽车接口实现类

      • class Qq implements Car{
        
            @Override
            public void run() {
                System.out.println("Qq可以跑60迈...");
            }
        
            @Override
            public void stop() {
                System.out.println("Qq刹车....");
            }
        
            @Override
            public String addOil(int num) {
                return "qq加"+num+"号油...";
        
            }
        
        }
        

         测试类

        public class TestProxy {
            public static void main(String[] args) {
                Qq qq = new Qq();
                Car proxyInstance = (Car) Proxy.newProxyInstance(qq.getClass().getClassLoader(), qq.getClass().getInterfaces(), (Object proxy, Method method, Object[] args1) -> {
                    if ("run".equals(method.getName())) {
                        System.out.println("Qq可以跑200迈");
                        return null;
                    }
        
                    System.out.println(method.invoke(qq, args1[0]));
                    return "哈哈";
        
                });
                proxyInstance.run();// Qq可以跑200迈
              // proxyInstance.stop(); //Qq刹车....
                System.out.println(proxyInstance.addOil(95)); // qq加95号油... 哈哈
            }
        
        }
        

          

         

posted @ 2019-09-24 16:12  这个杀手特别冷  阅读(222)  评论(0编辑  收藏  举报