首页 > 编程知识 正文

java动态代理模式,java实现代理

时间:2023-05-05 15:41:24 阅读:31801 作者:4727

因为AOP本身基于动态代理实现代理模型23(GoF )中的代理模型之一,所以学习代理模型对AOP的学习很有帮助,所以首先对代理模型进行说明

1 .如果代理类在静态代理模式程序运行之前已经存在,则代理方法为静态代理,在这种情况下代理类通常由Java代码定义。 通常,静态代理中的代理类和目标类实现相同的接口或从同一父类派生。

1.1创建接口/***定义公共接口* @author dpb[流行歌曲] * */publicinterfacesomeservice { stringdosome (); } 1.2接口实现类/***静态代理模式实现类* @author dpb[流行音乐] * */publicclassomeserviceimplementssomeservice { 1.3静态代理类/***代理类*扩展实现类*和实现类实现相同的接口* @author dpb[流行音乐] * */publicclasssomeproxyimplementer this.target=target; } /** *扩展方法*将返回的结果显示为大写*/@Override public String doSome () { return target.doSome ).toUpperCase; }} 1.4通过测试获得的publicstaticvoidmain (字符串[ ] args ) someservicesome=newsomeserviceimpl ); //获取静态代理对象someproxyproxy=newsomeproxy (some )的system.out.println (proxy.do some ); }

2 .动态代理模式代理类在程序运行时创建的代理方式为动态代理。 也就是说,在这种情况下,代理类不是在Java代码中定义的,而是在运行时根据Java代码中的“说明”动态生成的。

代理类型使用场景如果在JDK动态代理目标对象上实现了接口,如果在使用JDK的动态代理cglib动态代理目标对象上没有实现接口, 必须使用cglib动态代理2.1.JDK动态代理声明接口/** *定义公共接口* @author dpb[流行歌曲]**/publicinterfacesomeserver @author dpb[波波达克] * */publicclasssomeserviceimplimplementssomeservice { @创建overridepublicstringdosome } } JDK代理//静态代理对象SomeService proxy=(SomeService ) proxy.newproxyinstance (some.getclass ).getClassLoader ) /实现类行/实现类实现的所有接口都是newinvocationhandler((/处理器({/* * *代理对象) *方法目标的方法) * args目标方法@Overridepublicobjectinvoke )对象代理,metho ocation object [ ] args (throws throwable (string msg=(string ) method.iod ) return msg.toUpperCase (; }; ); system.out.println (proxy.do some ); }

2.2CGLIB动态代理引入cglib的jar包

目标类/** *静态代理模式实现类* @author dpb[流行音乐] * */publicclasssomeserviceimpl { publicstringdosome ()/todo autosome () 创建cglib委派类* @author dpb[流行歌曲] * */publicclasscglibproxyimplementsmethodinterceptor { privatesomeserviceiment }的pup }/* * *如何创建cglib代理对象* @ return */publicsomeserviceimplcreateproxy () /增强器增强器e=new增强器); //指定回调接口对象e.set super class (this )的cglib代理对象,该对象指定父类e.set super class (someserviceimpl.class ) }/** *拦截方法*/@ overridepublicobjectintercept (objectobj,Method method,Object[] agrs,MethodProxy proxy ) throws throby }测试publicstaticvoidmain (字符串[ ] args (//目标对象someserviceimplsome=newsomeserviceimpl ); //代理someserviceimplproxy=newcglibproxy (some ).createProxy ); system.out.println (proxy.do some ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。