首页 > 编程知识 正文

jdk动态代理是如何实现的,动态代理与静态代理的区别

时间:2023-05-04 12:36:51 阅读:31803 作者:4346

动态代理动态代理简单地说,就是在程序运行中,创建代理对象,代理对象执行方法,从而为目标类的方法添加额外的功能,也称为功能扩展

JDK动态代理的实现步骤1 .首先,您需要一个目标类,以便动态代理基于目标类实现增强

为InvocationHandler接口创建实现类,在此类中实现invoke方法,并在invoke方法中实现方法扩展到目标类

3 .通过从JDK代理创建代理,然后从代理调用目标类的方法来实现增强

JDK动态代理的代码实现创建了一个接口。

publicinterfacesomeservice { voiddosome (; void doOther (; }目标类实现此接口。

运行publicclasssomeserviceimplimplementssomeservice { @ overridepublicvoiddosome (} { system.out.println (do some ) }; } @Override public void doOther () { System.out.println ) (运行' doOther ' ); }创建包含增强功能的工具类。

publicclassservicetools { publicstaticvoiddolog (} { system.out.println ) }方法的执行时间: ' new Date; } publicstaticvoiddotrans ((system.out.println ) )方法执行完毕。 提交事务) ); 为InvocationHandler接口创建实现类

publicclassmyinvocationhandlerimplementsinvocationhandler//目标专用对象目标; publicmyinvocationhandler (object target ) { this.target=target; 在//代理对象上执行方法时,此invoke (方法/** * * @param proxy代理类实例* @param method代理的方法* @param args方法@throws Throwable */)/@ overridepublicobjectinvoke (object proxy,Method method, 运行Object[] args ) throws throwable (system.out.println ) (mytem.println )//调用的目标类的方法名称system.out.) 对象RES=null; //该方法由动态代理实现的增强型服务工具. dolog (; //执行目标类的方法,并在Method中实现RES=method.invoke(target,args )//此方法是由动态代理实现的增强功能ServiceTools.doTrans //返回到目标方法执行结果return res; }通过代理创建代理

公共类myapp { publicstaticvoidmain (字符串[ ] args )//创建目标对象someservicetarget=newsomeserviceimpl ); 创建InvocationHandler对象invocationhandlerhandler=newmyinvocationhandler (target ); 使用Proxy代理SomeService proxy=(SomeService ) proxy.newproxyinstance (target.getclass ).getClassLoader )、target //}运行结果如下。

从运行结果中可以看到,动态代理可以增强目标类的功能,而无需更改目标类的源代码。 下面总结一下动态代理的作用。

1 .在不更改目标类源代码的情况下添加目标类的功能

2 .如果需要为多个方法添加相同的功能,动态代理可以减少代码重复

3 .可以将目标类集中在业务逻辑代码上

4 .实现解耦,使业务功能与日志、事务与非事务功能分离

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