alibaba / jvm-sandbox

Real - time non-invasive AOP framework container based on JVM
GNU Lesser General Public License v3.0
6.77k stars 1.56k forks source link

如何在ReturnEvent中获取当前方法的参数信息呢 #413

Closed joker00425 closed 5 months ago

joker00425 commented 1 year ago

项目中原先使用的AdviceListener,在com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener#afterReturning中可以获取到参数,后面使用了EventListener发现无法从ReturnEvent事件中获取参数,请问大佬们有何解法

oldmanpushcart commented 1 year ago

如果不是太在意性能,可以直接用AdviceListener 常规的做法是用一个ThreadLocal把BeforeEvent中的入参信息拿到并存起来,在ReturnEvent的时候从ThreadLocal中拿出来使用,记得在ReturnEvent和ThrowsEvent的时候清理ThreadLocal哈

joker00425 commented 1 year ago

如果不是太在意性能,可以直接用AdviceListener 常规的做法是用一个ThreadLocal把BeforeEvent中的入参信息拿到并存起来,在ReturnEvent的时候从ThreadLocal中拿出来使用,记得在ReturnEvent和ThrowsEvent的时候清理ThreadLocal哈

感谢大佬提醒,我们是采集比较底层的调用,对性能有一定要求的,应该要切换到EventListener 顺便再问一下,EventListener相比AdviceListener性能上的提升在于哪里呢

oldmanpushcart commented 1 year ago

EventListener的优势是内存亲和。所有的Event是在线程中单例持有,整个事件处理过程中不会新分配任何的JVM对象。

AdviceListener将大部分场景都需要的处理集成到了Advice对象中,在事件处理过程中创建了Advice对象用于关联Before、Return/Throws,同时还采用了反射拿到了Class和Method。这些累积起来对性能敏感的场景是一个损耗。