首页 > 编程知识 正文

JAVA 动态代理,jdk动态代理为什么必须实现接口

时间:2023-05-03 06:20:25 阅读:31800 作者:1885

JDK动态代理的定义和功能动态代理是使用JDK反射机制创建对象的能力,它创建代理类的对象而不是类文件,而无需编写java文件。 动态代理常用的有jdk动态代理和cglib动态代理两种。 jdk动态代理需要接口,代理类对象需要实现接口。 如果没有接口,则使用cglib动态代理。 我的主要功能是增强功能。 用后面的代码说明。 另一个功能是控制访问。 了解动态代理的核心方法和思路java.lang.reflect。 反射包包含三个类: InvocationHandler、Method和Proxy。 实现InvocationHandler接口。 接口包含表示代理对象执行的功能代码的方法invoke ()。 Method类:过了Method后,可以执行某个目标类的方法。 Method.invoke () )相当于对在静态代理上执行的方法的调用。 Proxy类:核心对象,用于创建代理对象。 通常,设置对象是使用new类的生成方法,动态代理使用Proxy类而不是new。 有三个参数。 (1) ClassLoader loader )在类加载器中,将对象加载到内存中。 )2)班? [ ]接口:获取目标对象的实现类接口。 (3) InvocationHandler )代理类对象,表示代理类应发挥的功能。 实现代理类的代码实现和理解代理类的对象

让我们通过动态代理实现事务提交功能来列举板栗吧。 从测试类开始很有效哦。 推荐。

publicclasstransactioninvocationhandlerimplementsinvocationhandler { privateobjecttarget; //实现动态代理的实现类publictransactioninvocationhandler (对象目标) { this.target=target; } @ overridepublicobjectinvoke (对象代理,方法方法,对象[ ] args ) throwsthrowable ) SQLsessionsession=null; 获取SqlSession用于获取dao层的连接Object obj=null; 获取//方法的返回值对象try//Dao层连接。 对此不了解的学生请去看mybatissession=sqlsessionutil.getsession ()。 处理//业务逻辑相当于在静态代理中执行方法。 在其前后部分可以编写其他方法,只要使用动态代理对象调用方法,就会执行在invoke方法前后定义的方法obj=method.invoke(target,args )。 //业务逻辑处理结束后,提交事务session.commit (; }catch(exceptione ) { session.rollback ); e .打印堆栈跟踪(; }使用}finally { //工具类关闭连接sqlsessionutil.myclose(session ); }返回对象; }publicobjectgetproxy((//参数传递给名为TransactionInvocationHandler的类对象, 用于获取以target为目标类的动态代理对象returnproxy.newproxyinstance ) target .的服务层动态代理对象的工具类,然后接收到的ssystem

//参数serviceservice是在service层中实现某种方法的实现类对象publicclassservicefactory { publicstaticobjectgetservice (对象服务

public class myapp { @ testpublicvoidtest 01 ()//new方式下静态服务对象studentserviceservice=newstudentserviceimpl ); //添加一个数据Student student=new Student (; sudent.setid(1314225 ); sudent.setname(Xihai ); sudent.setage(20; 缺省情况下,sqlsession不会自动提交,因此数据库中没有插入数据。 //具体的dao实现方法insert自己写吧。 我主要不是在说数据库方面的内容,而是为了清楚起见,我举例说明了事务的处理service.insert(student )。 } @ testpublicvoidtest 02 (使用/JDK中的Proxy生成动态代理对象studentserviceserviceproxy=(studentservice ) service factory.getsesery sudent.setid(1314226 ); student.setname(shengge ); sudent.setage(21; //由于向动态代理对象添加了事务提交功能,插入成功。 /*现在,我们执行TransactionInvocationHandler对象的invoke方法。 对象的invoke方法的三个参数分别表示serviceProxy代理对象、insert方法和student参数。 * /服务代理. insert (student ); }

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