zoukankan      html  css  js  c++  java
  • JDK的动态代理

    jdk动态代理

    1. 可以新建一个普通的Java项目用于练习jdk的动态代理
    2. 实现动态代理的思路:
      1. 创建一个接口,并新加一个类实现该接口
      2. 在创建一个实现接口的InvocationHanler的类,并实现invoke的方法
      3. 新建一个类测试,在这个测试方法中使用Proxy.newProxyInstance创建代理类
    3. 分解思路:接口
      public interface HireHouse {
          public void Hire();
      }
    4. 实现接口
      public class HireHouseImpl implements HireHouse {
          //实现接口
          @Override
          public void Hire() {
              System.out.println("HireHouseImpl实现接口:HireHouse");
          }
      }

      对应思路步骤2

    5. import java.lang.reflect.InvocationHandler;
      import java.lang.reflect.Method;
      
      
      /*
          实现接口:InvocationHandler
       */
      public class HireProxy implements InvocationHandler {
          //被代理的真实的角色
          private Object obj;
          
          public HireProxy(Object obj) {
              super();
              this.obj = obj;
          }
          
          /**
           * jdk的动态代理,被代理的对象必须实现接口
           * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
           * method:我们所要调用某个对象真实的方法的Method对象(被代理对象的接口方法)
           * args:指代代理对象方法传递的参数(是被代理对象的接口方法的参数)
           */
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              System.out.println("前置工作");
              System.out.println("------参数--------");
              for(Object obj1 : args){
                  System.out.println(obj1);
              }
              System.out.println("------参数--------");
              Object invoke = method.invoke(obj, args);
              System.out.println("后置工作");
              return invoke;
          }
      }
    6. 测试代理
      import java.lang.reflect.Proxy;
      import java.util.ArrayList;
      import java.util.List;
      
      public class Test {
          public static void main(String[] args) {
      //        //创建被代理的接口实现类的对象
      //        HireHouseImpl h=new HireHouseImpl();
      //        //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象
      //        HireHouse hireHouse = (HireHouse)Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), new HireProxy(h));
      //        hireHouse.Hire();
          
              //创建被代理的接口实现类的对象
              List list = new ArrayList();
              //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象
              List hh = (List) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new HireProxy(list));
              hh.add("张三");
          }
      
      }
    7. 结果如图

      

  • 相关阅读:
    Linux--awk命令详解
    【python】将txt文本内容导入list列表
    【python】readlines( )函数的用法,读取文件内容
    【python】使用jieba分词并导出txt
    【python】module 'jieba' has no attribute 'cut'解决办法
    【python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position...解决办法
    pip安装python模块时报错,安装失败的解决办法,超详细!(Read timed out.等)
    【热力图】区域地图热力图,百度地图api
    【XAMPP】 Error: Apache shutdown unexpectedly. 11:00:50  [Apache] 解决办法详细
    Linux进入文件夹,查看文件,返回上级目录,查看列表文件(Ubuntu)
  • 原文地址:https://www.cnblogs.com/LBJLAKERS/p/11389406.html
Copyright © 2011-2022 走看看