java 中动态代理(JDK,cglib)实例代码
java动态代理实例详解
1.jdk动态代理
/** * */ packagecom.sinosoft; /** *接口:编写一个委托类的接口,即静态代理的(Apple接口) * */ publicinterfaceApple{ publicvoidphoneCall(); } /** * */ packagecom.sinosoft; /** *实现一个真正的委托类,即静态代理的(AppleImpl类) * */ publicclassAppleImplimplementsApple{ /* *打电话 */ @Override publicvoidphoneCall(){ System.out.println("打电话"); } } /** * */ packagecom.sinosoft; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; /** *创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法 * */ publicclassDynamicProxyimplementsInvocationHandler{ privateObjectobject; publicDynamicProxy(Objectobject){ this.object=object; } /* *proxy参数传递的即是代理类的实例。method是调用的方法,即需要执行的方法;args是方法的参数; *@paramproxy *@parammethod *@paramargs *@return *@throwsThrowable */ @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{ Objectresult=method.invoke(object,args); returnresult; } } /** * */ packagecom.sinosoft; importjava.lang.reflect.Proxy; /** *@authorjdk动态代理 * */ publicclasstestDynamicProxy{ publicstaticvoidmain(String[]args){ //1.创建接口的实现类 AppletApple=newAppleImpl(); //2.动态代理类 DynamicProxytDynamicProxy=newDynamicProxy(tApple); ClassLoadertClassLoader=tApple.getClass().getClassLoader(); //创建动态代理的对象,需要借助Proxy.newProxyInstance。该方法的三个参数分别是: //ClassLoaderloader表示当前使用到的appClassloader。 //Class>[]interfaces表示目标对象实现的一组接口。 //InvocationHandlerh表示当前的InvocationHandler实现实例对象。 Appleapple=(Apple)Proxy.newProxyInstance(tClassLoader,newClass[]{Apple.class},tDynamicProxy); apple.phoneCall(); } }
2.cglib动态代理
/** * */ packagecom.sinosoft; /** *实现一个真正的委托类,即静态代理的(AppleImpl类) * */ publicclassAppleClass{ /* *打电话 */ publicvoidphoneCall(){ System.out.println("打电话"); } } /** * */ packagecom.sinosoft; importjava.lang.reflect.Method; importnet.sf.cglib.proxy.MethodInterceptor; importnet.sf.cglib.proxy.MethodProxy; /** *@authorAdministrator * */ publicclassCglibProxyimplementsMethodInterceptor{ /* *方法功能描述 *@paramobj *@parammethod *@paramargs *@paramproxy *@return *@throwsThrowable *@seenet.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object,java.lang.reflect.Method,java.lang.Object[],net.sf.cglib.proxy.MethodProxy) */ @Override publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{ //TODOAuto-generatedmethodstub Objectobject=proxy.invokeSuper(obj,args); returnobject; } } /** * */ packagecom.sinosoft; importnet.sf.cglib.proxy.Enhancer; /** *@authorAdministrator * */ publicclassTestCglibProxy{ publicstaticvoidmain(String[]args){ CglibProxytCglibProxy=newCglibProxy(); EnhancertEnhancer=newEnhancer(); tEnhancer.setSuperclass(AppleClass.class); tEnhancer.setCallback(tCglibProxy); AppleClasstApple=(AppleClass)tEnhancer.create(); tApple.phoneCall(); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!