动态代理(理解)

掌握内容:

1.什么是动态代理?

2.动态代理能干什么?

1.简单介绍

1.现实中:

  1.你:有一个项目需要短信验证码用来校验登录,但是你没有能力让运营商帮你给用户发短息。

  2.动态代理:于是你找到了运营商的子公司,它们可以帮你发短息,完成你的需求。

  3.目标:这样即使没有运营商的直接帮助,它们的子公司也间接的完成了你发短息的需求。

2.开发中:

  A类:想要调用C类的方法,不让A类调用方法

  动态代理:于是A类通过与C类关联的B类,完成了调用A类方法的需求。

  目标:这样即使没有直接访问C类,通过关联的B类也完成了调用C类方法的需求。

3.小结:使用代理对象是为了在不改变目标对象的基础上,增强主业务逻辑。

2.代理模式能干什么?

1.增强功能

2.控制访问

3.代理有几种方式?

1.静态代理

  1.概念:

    1.代理的目标类是固定的,只能代理这一个目标类

    2.代理类需要自己手工实现

  2.特点:实现简单、容易理解。

  3.缺点:
      1.当目标类增加时代理类也要增加。
      2.在接口中增加或者修改功能会影响存在的实现类、代理类等

2.动态代理

  1.出现的原因:为了修正静态代理的缺点,出现了动态代理。
  2.动态代理特征:
      1.目标类可以有很多,但是代理类数量可以很少
      2.当你修改了接口中的方法时,不会影响代理类

  3.概念:

    1.在程序执行过程中,使用JDK的反射机制,创建代理类对象,然后动态的执行要代理的目标类。
    2.动态代理可以不用创建类,就能创建对象。

4.动态代理的实现方式?

1.JDK动态代理(理解):
    1.使用java反射包中的类和接口实现动态代理的功能
    2.反射包:java.lang.reflect
        1.InvocationHandler类
        2.Method类
        3.Proxy类
2.cglib动态代理(了解)
    1.它是第三方工具库,创建代理对象。
    2.原理:继承。
        1.通过继承目标类,创建它的子类。
        2.在子类中重写方法,实现功能修改。
    3.要求目标类比较宽松,能继承即可。
    4.应用在mybatis、Spring等框架中。

5.回顾Method类

1.HelloService接口

package com.dc.test;
public interface HelloService {
    public void sayHello(String name);
}

2.接口实现类

package com.dc.test;
public class HelloServiceImplement implements HelloService{
    @Override
    public void sayHello(String name) {
        System.out.println("你好" + name);
    }
}

3.另一个接口实现类

package com.dc.test;
public class HelloServiceImplement2 implements HelloService{
    @Override
    public void sayHello(String name) {
        System.out.println("再见"+ name);
    }
}

4.测试类

package com.dc.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /**
         *  1.先来个实现类对象
         *  2.通过接口的类的(getMethod)方法,获取sayHello方法名称对应的Method类对象
         *      1.getMethod方法两个属性:
         *          1.方法名称对应的对象
         *          2.方法的参数
         *      2.返回值是一个Method类。
         *  3.通过Method类的invoke方法,执行sayHello方法的调用
         *      1.invoke方法的参数:
         *          1.Object:表示对象,你要执行的是哪个对象
         *          2.Object..args,执行某个对象的方法时的参数值
         *      2.返回值:Object
         *  4.Object ret = method.invoke(target,"json");
         *  5.表示:执行target代表的对象的sayHello方法,参数是jason
         *  6.小结:
         *      1.以前是对象.方法
         *      2.现在是方法.对象
         */
        HelloServiceImplement target = new HelloServiceImplement();
        Method method = HelloService.class.getMethod("sayHello", String.class);
        Object ret = method.invoke(target,"jason");

        // 你传入哪个对象,就执行哪个对象的方法
        HelloServiceImplement2 target2 = new HelloServiceImplement2();
        Object ret2 = method.invoke(target2, "jason");
    }
}

6.JDK动态代理详解

1.使用java反射包中的类和接口实现动态代理的功能
2.反射包:java.lang.reflect
        1.InvocationHandler接口

     1.该接口只有一个invoke()方法:表示你的代理要干什么
         1.方法名:public object invoke(Object proxy,Method method,object[] args)
         2.参数:
              1.Object proxy:JDK创建的代理对象,无需赋值
              2.Method method:目标类中的方法
              3.Object args:目标类中方法的参数
    2.JDK动态代理的实现步骤:
        1.创建一个类实现InvocationHandler接口
        2.重写invoke方法
        2.Method类
      1.作用:通过Method可以执行某个目标类的方法
      2.格式:method.invoke(目标对象,方法中的参数);
      3.示例:Object ret = method.invoke(service,"jason");
  3.Proxy类:
      1.(静态)方法:newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
      2.作用:创建代理对象。
      3.参数:
          1.ClassLoader loader:类加载器,负责向内存中加载对象的。  

     2.Class<?>[] interfaces:目标对象实现的接口
          3.InvocationHandler h:代理类要完成的功能
      4.返回值:代理对象
注意:动态代理在使用的时候必须有接口。

posted @ 2021-03-03 21:06  兵长砍猴  阅读(213)  评论(0)    收藏  举报