java中深入浅析JDK的动态代理类

  介绍

这期内容当中小编将会给大家带来有关深入浅析java中JDK的动态代理类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>详解java JDK动态代理类分析(java.lang.reflect.Proxy)

/* *   * JDK动态代理类分析(java.lang.reflect.Proxy使用)   *   * @author张明学   *   */公开课ProxyStudy {      @SuppressWarnings (“unchecked")   公共静态void main (String [] args){抛出异常//动态代理类:通用指定类加载器,和接口产生一类//getProxyClass()返回代理类的. lang。类对象,并向其提供类加载器和接口数组。   类clazzProxy=Proxy.getProxyClass (Collection.class.getClassLoader (), Collection.class);   System.out.println(“动态产生的类名为:“+ clazzProxy.getName ());   System.out.println(“- - - - - - - - - - -获取动态产生的类的构造方法- - - - - - -产生绯闻;);   构造函数[]构造函数=clazzProxy.getConstructors ();   int i=1;   (构造函数构造函数:构造函数){   System.out.println(第“;+我+ + +“个构造方法名:“+ constructor.getName ());   类[]parameterClazz=constructor.getParameterTypes ();   System.out.println(第“;+我+ + +“个构造方法参数:“+ arrays . aslist (parameterClazz));   }   System.out.println(“- - - - - - - - - - -获取动态产生的类的普通方法- - - - - - -产生绯闻;);   方法[]方法=clazzProxy.getDeclaredMethods ();   for (int j=0;j & lt;methods.length;j + +) {   方法方法=方法[j];   System.out.println(第“;+ (j + 1) +“个普通方法名:“+ method.getName ());   类[]parameterClazz=method.getParameterTypes ();   System.out.println(第“;+ (j + 1) +“个普通方法参数:“+ arrays . aslist (parameterClazz));   }   System.out.println(“- - - - - - - - - -获取动态代理对象的构造方法- - - - - - -产生绯闻;);//动态代理产生的对象的构造方法需要一个实现java.lang.reflect.InvocationHandler接口的对象,故不能通过//clazzProxy.newInstance();产生一个对象,可以根据构造方法产生一个对象//InvocationHandler是代理实例的调用处理程序实现的接口。   构造函数构造函数=clazzProxy.getConstructor (InvocationHandler.class);//代理产生的对象   收集proxyBuildCollection=(集合)构造函数   .newInstance(新InvocationHandler () {//为什么这里选择ArrayList作为目标对象吗?//因为这里的构造函数是clazzProxy这个动态类的构造方法,clazzProxy是通过Proxy.getProxyClass()方法产生的,//该方法有两个参数,一个是指定类加载器,一个是指定代理要实现的接口,这个接口我上面指定了集合//而ArrayList实现了收集接口,固可以为该动态类的目标对象   ArrayList目标=new ArrayList();//动态类的目标对象      公共对象调用对象代理、方法方法,   {Object [] args)抛出Throwable   System.out.println(“执行目标,+ method.getName() +“方法之前:“   + System.currentTimeMillis ());   结果=方法对象。调用(目标,args);//其实代理对象的方法调用还是目标对象的方法   System.out.println(“执行目标,+ method.getName() +“方法之后:“   + System.currentTimeMillis ());   返回结果;   }      });   proxyBuildCollection.clear ();   proxyBuildCollection.add (“abc");   proxyBuildCollection.add (“dbc");   System.out.println (proxyBuildCollection.size ());   System.out.println (proxyBuildCollection.getClass () . getname ());/* *   *动态代理:总结如下:   * 1,通过Proxy.getProxyClass(类加载器,接口)方法产生一个动态类的类字节码(clazz)   *该getProxyClass()方法有两个参数:一个是指定该动态类的类加载器,一个是该动态类的要实现的接口(从这里可以看现JDK的动态代理必须要实现一个接口)   *   * 2,通过第一步的获取的clazz对象可以获取它的构造方法构造函数,那么就可以通用构造函数的newInstance()方法构造出一个动态实体对象   *但构造函数的newInstance()方法需要指定一个实现了InvocationHandler接口的类处理程序,在该类中需要一个目标对象一个和实现调用方法   *目标对象一个要求能对第一步中的接口的实现,因为在调用方法中将会去调用一个中的方法并返回结果。   *过程如下:调用动态代理对象ProxyObject的x方法——比;进入构造方法传进的处理程序的调用方法——比;调用方法调用处理程序中的目标对象   *的x方法(所以要求目标必须要实现构造动态代理类时指定的接口)并返回它的返回值。(其实如果我们代理P类,那么目标就可以选中P类,只是要求P必需实现一个接口)   *   *那么上述中x方法有哪些呢?除了从对象继承过来的方法中除toString, hashCode,等于外的方法不交给处理程序外,其它的方法全部交给处理程序处理   *如上面proxyBuildCollection.getClass () . getname()就没有调用处理器的getClass方法,而是调用自己的   *   * 3,在处理程序的调用方法中返回method.invoke(目标,args)就是将方法交给目标去完成。那么在这个方法执行之前,之后,异常时我们都可以做一些操作,   *并且可以在执行之前检查方法的参数args,执行之后检查方法的结果   */System.out.println(“- - - - - - - - - - - - - - - - - - -下面的写法更简便- - - - - - - - - - - - - - - - - - - - - -“);//proxyBuildColl是对ArrayList进行代理   收集proxyBuildCollection2=(集合)Proxy.newProxyInstance (   Collection.class.getClassLoader()//指定类加载器   新类[]{收藏。},//指定目标对象实现的接口//指定处理程序   新的InvocationHandler () {   ArrayList目标=new ArrayList ();      公共对象调用对象代理、方法方法,   {Object [] args)抛出Throwable   System.out.println (method.getName() +“执行之前…“);   如果(零!=args) {   System.out.println(“方法的参数:“+ arrays . aslist (args));   其他}{   System.out.println(“方法的参数:“+零);   }   结果=方法对象。调用(目标,args);   System.out.println (method.getName() +“执行之后…“);   返回结果;   }   });   proxyBuildCollection2.add (“abc");   proxyBuildCollection2.size ();   proxyBuildCollection2.clear ();   proxyBuildCollection2.getClass () . getname ();      System.out.println(“- - - - - - - - - - - - - - - - - - -对JDK动态代理的重构- - - - - - - - - - - - - - - - - - - - - -“);   设置proxySet=(套)buildProxy (new HashSet(),新的MyAdvice ());   proxySet.add (“abc");   proxySet.size ();   }/* *   *构造一个目标对象的代理对象   *   * @param目标   *目标对象(需要实现某个接口)   * @return   */公共静态对象buildProxy(最终对象目标,最终AdviceInter建议){   对象proxyObject=Proxy.newProxyInstance (   .getClassLoader target.getClass()()//指定类加载器   .getInterfaces target.getClass()()//指定目标对象实现的接口   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

java中深入浅析JDK的动态代理类