动态代理(理解)
掌握内容:
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.返回值:代理对象
注意:动态代理在使用的时候必须有接口。
                    
                
                
            
        
浙公网安备 33010602011771号