详解java JDK 动态代理类分析(java.lang.reflect.Proxy)
详解javaJDK动态代理类分析(java.lang.reflect.Proxy)
/** *JDK动态代理类分析(java.lang.reflect.Proxy使用) * *@author张明学 * */ publicclassProxyStudy{ @SuppressWarnings("unchecked") publicstaticvoidmain(String[]args)throwsException{ //动态代理类:通用指定类加载器,和接口产生一类 //getProxyClass()返回代理类的java.lang.Class对象,并向其提供类加载器和接口数组。 ClassclazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); System.out.println("动态产生的类名为:"+clazzProxy.getName()); System.out.println("----------获取动态产生的类的构造方法---------"); Constructor[]constructors=clazzProxy.getConstructors(); inti=1; for(Constructorconstructor:constructors){ System.out.println("第"+(i++)+"个构造方法名:"+constructor.getName()); Class[]parameterClazz=constructor.getParameterTypes(); System.out.println("第"+(i++)+"个构造方法参数:"+Arrays.asList(parameterClazz)); } System.out.println("----------获取动态产生的类的普通方法---------"); Method[]methods=clazzProxy.getDeclaredMethods(); for(intj=0;j进入构造方法传进的handler的invoke方法————>invoke方法调用handler中的target对象 *的x方法(所以要求target必须要实现构造动态代理类时指定的接口)并返回它的返回值。(其实如果我们代理P类,那么target就可以选中P类,只是要求P必需实现一个接口) * *那么上述中x方法有哪些呢?除了从Object继承过来的方法中除toString,hashCode,equals外的方法不交给handler外,其它的方法全部交给handler处理 *如上面proxyBuildCollection.getClass().getName()就没有调用handler的getClass方法,而是调用自己的 * *3,在handler的invoke方法中returnmethod.invoke(target,args)就是将方法交给target去完成。那么在这个方法执行之前,之后,异常时我们都可以做一些操作, *并且可以在执行之前检查方法的参数args,执行之后检查方法的结果 */ System.out.println("-------------------下面的写法更简便--------------------"); //proxyBuildColl是对ArrayList进行代理 CollectionproxyBuildCollection2=(Collection)Proxy.newProxyInstance( Collection.class.getClassLoader(),//指定类加载器 newClass[]{Collection.class},//指定目标对象实现的接口 //指定handler newInvocationHandler(){ ArrayListtarget=newArrayList(); publicObjectinvoke(Objectproxy,Methodmethod, Object[]args)throwsThrowable{ System.out.println(method.getName()+"执行之前..."); if(null!=args){ System.out.println("方法的参数:"+Arrays.asList(args)); }else{ System.out.println("方法的参数:"+null); } Objectresult=method.invoke(target,args); System.out.println(method.getName()+"执行之后..."); returnresult; } }); proxyBuildCollection2.add("abc"); proxyBuildCollection2.size(); proxyBuildCollection2.clear(); proxyBuildCollection2.getClass().getName(); System.out.println("-------------------对JDK动态代理的重构--------------------"); SetproxySet=(Set)buildProxy(newHashSet(),newMyAdvice()); proxySet.add("abc"); proxySet.size(); } /** *构造一个目标对象的代理对象 * *@paramtarget *目标对象(需要实现某个接口) *@return */ publicstaticObjectbuildProxy(finalObjecttarget,finalAdviceInteradvice){ ObjectproxyObject=Proxy.newProxyInstance( target.getClass().getClassLoader(),//指定类加载器 target.getClass().getInterfaces(),//指定目标对象实现的接口 //handler newInvocationHandler(){ publicObjectinvoke(Objectproxy,Methodmethod, Object[]args)throwsThrowable{ advice.beforeMethod(target,method,args); Objectresult=method.invoke(target,args); advice.afterMethod(target,method,args); returnresult; } }); returnproxyObject; } }
/** *代理中执行目标方法之前之后的操作的一个实例 * *@author张明学 * */ publicclassMyAdviceimplementsAdviceInter{ publicvoidafterMethod(Objecttarget,Methodmethod,Object[]args){ System.out.println("目标对象为:"+target.getClass().getName()); System.out.println(method.getName()+"执行完毕!"); } publicvoidbeforeMethod(Objecttarget,Methodmethod,Object[]args){ System.out.println(method.getName()+"开始执行"); if(null!=args){ System.out.println("参数为:"+Arrays.asList(args)); }else{ System.out.println("参数为:"+null); } } }
/** *代理中执行目标方法之前之后的操作 * *@author张明学 * */ publicinterfaceAdviceInter{ /** *目标方法执行之前 * */ publicvoidbeforeMethod(Objecttarget,Methodmethod,Object[]args); /** *目标方法执行之后 * *@paramtarget *目标对象 *@parammethod *方法 *@paramargs *参数 */ publicvoidafterMethod(Objecttarget,Methodmethod,Object[]args); }