首页 > 编程知识 正文

bubbleupnp使用教程,invoke方法详解

时间:2023-05-06 10:19:10 阅读:10935 作者:451

在上一个示例中,jdk动态代理生成代理对象的源代码分析清楚地显示了代理对象如何扩展和回调。 接下来,我们继续分析JdkDynamicAopProxy如何回调以扩展目标对象。 同样,JdkDynamicAopProxy也实现了InvocationHandler接口的invoke方法。 在JdkDynamicAopProxy中生成代理对象时,使用方法通过调用proxy.newproxyinstance (class loader,proxiedInterfaces,this )来生成代理对象其中,this参数对应于InvocationHandler对象。 InvocationHandler是JDK定义的反射类接口,该接口定义invoke方法,该方法表现为JDK代理对象阻止的回调项JdkDynamicAopProxy实现了InvocationHandler接口。 也就是说,调用Proxy对象的代理方法时,JdkDynamicAopProxy的invoke方法作为Proxy对象的回调函数启动,根据invoke的具体实现,目标对象方法从代码列表中可以看到,Proxy对象的代理设置是在invoke方法中进行的。 这些设置将创建目标对象检索、区块链以及使用这些对象作为输入的ReflectiveMethodInvocation对象。 此ReflectiveMethodInvocation对象完成了Aop功能:在invoke方法中,获取拦截器链,放置拦截器链中的拦截器,以及拦截器链中的拦截器包括通过完整的拦截器链拦截目标对象的过程,如最后执行目标对象方法。

JdkDynamicAopProxy代理对象的回调主代码

在invoke方法中,获取拦截器链,如果拦截器链为空则直接调用目标方法,如果拦截器链不为空则调用拦截器链,然后调用目标方法

首先获得拦截器链,listobjectchain=http://www.Sina.com/. http://www.Sina.com/. getinterceptorsandddynamicinterception

this是AdvisedSupport对象,从类继承来看,该AdvisedSupport类还是ProxyFactoryBean的基类。 从AdvisedSupport的代码中可以看到getinterceptorsanddynamicinterceptionadvice的实现。 代码清单如下。 该方法获得了拦截器链,在获取拦截器链时,为了提高拦截器的获取效率而设置了缓存。

AdvisedSupport类的getinterceptorsanddynamicinterceptionadvice方法

在这里,我们使用cache,通过cache获得了现有的inteceptor链,但第一次需要自己生成。 该接口链的生成由advisorChainFactory进行,这里使用的是DefaultAdvisoChainFactory。 在DefaultAdvisorChainFactory中实现了拦截器链的捕获进程。 代码如下。

DefaultAdvisorChainFactory类的getinterceptorsanddynamicinterceptionadvice方法

在此捕获进程中,首先设置一个列表,该列表的长度由部署的通知器数量决定,该通知器是在XML中为ProxyFactoryBean进行的interceptorNames属性部署。 之后,DefaultAdvisorChainFactory通过一个AdvisorAdapterRegistry实现拦截器注册,AdvisorAdapterRegistry在advice通知的组织功能中起着很大的作用AdvisorAdapterRegistry注册器(如果有)通过利用它来适应来自ProxyFactoryBean配置的通知,获得适当的拦截器,并将其添加到之前设置的List中,从而完成所谓的拦截器注册过程。 拦截器自适应和注册过程完成后,list中的拦截器将由JDK生成的AopProxy代理对象的invoke方法或CGLIB代理对象的interceptor拦截器方法检索,并且以前在3-ProxyFactoryBean中生成的AopProxy代理对象已经在拦截器中注册,其中interceptors1=registry.get interceptors (advisor ) 获取拦截器对象并使其匹配。 具体获取代码如下。

DefaultAdvisorAdapterRegistry类的getInterceptors方法

到目前为止,对第一点的调用已完成,拦截器已获取。

然后确定阻塞链是否存在,如果阻塞链不存在,则直接调用。 代码如下。

到此为止,第二点的分析已经完成了。 如果存在区块链,则下一个3、4点的invocation=newreflectivemethodinvocation (代理、目标、方法、args、目标类、chain

retVal=invocation.proceed (; 要调用拦截器和目标方法,请首先实例化ReflectiveMethodInvocation对象,然后单击代理对象、目标对象、目标方法、参数、目标ccation 具体代码如下。

ReflectiveMethodInvocation类

在process方法中,首先判断拦截器链是否已调用,如果已调用,则调用所需的方法,如果未调用,则递归调用proceed方法。

我在网上找了几乎详细的东西。 请仔细查看http://www.docin.com/p-1529480972.html

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