当前位置:   article > 正文

JVM-SandBox 源码解析-代码增强植入篇_jmv-sandbox增加请求入参

jmv-sandbox增加请求入参

目录

〇、架构图镇楼

一、带着问题读源码

二、撸起袖子开始肝

1. 观察者构建器(EventWatchBuilder)

IBuildingForClass

IBuildingForBehavior

IBuildingForWatching

EventWatcher

2. 事件观察者(ModuleEventWatcher)

watch()方法

watching()方法

delete()方法

3. 形变器(SandboxClassFileTransformer) 

类的构造函数

_transform方法

4. 事件代码增强器(EventEnhancer)

5. 方法事件编织者(EventWeaver)

visitMethod方法

三、总结


〇、架构图镇楼

此篇主要解析代码编制部分源码,涉及少部分EveneListener和事件分发处理。

一、带着问题读源码

当我们在使用JVM-Sandbox编写模块时,通常会编写类似这种代码:

会发现增强后的业务代码的都是这样:

以Spy.spyMethodOnBefore为例

其实际调用的是spyHandler.handleOnBefore方法,看下方法的Javadoc如下:

  1. /**
  2. * 处理方法调用:调用之前
  3. * <p>BEFORE</p>
  4. *
  5. * @param listenerId 事件监听器ID
  6. * @param targetClassLoaderObjectID 类所在ClassLoader
  7. * @param argumentArray 参数数组
  8. * @param javaClassName 类名
  9. * @param javaMethodName 方法名
  10. * @param javaMethodDesc 方法签名
  11. * @param target 目标对象实例
  12. * @return Spy流程控制结果
  13. * @throws Throwable 处理{方法调用:调用之前}失败
  14. */
  15. Spy.Ret handleOnBefore(int listenerId, int targetClassLoaderObjectID, Object[] argumentArray, String javaClassName, String javaMethodName, String javaMethodDesc, Object target) throws Throwable;

此时,你是否心中有很多疑问,这些代码它是怎么到业务代码里面去的,里面的各种id是如何生成的?怎么跟我们通过Sandbox-Api写的代码关联起来的? 

那么接下来看看JVM-Sandbox是如何进行源码增强,具体步骤是如何,增强过程涉及到哪些定义的组件,各组件起到什么作用。

二、撸起袖子开始肝

1. 观察者构建器(EventWatchBuilder)

在我们编写的代码里,都会使用事件观察者(ModuleEventWatcher)。那么我们就从事件观察者构建器开始:

构建器处于包com.alibaba.jvm.sandbox.api.listener.ext下,从上图可以看到观察者构建器主要作用是构建类匹配器(IBuildingForClass)、构建方法匹配器(IBuildingForCBehavior)、构建观察构建器(IBuildingForWatching)、删除观察构建器(IBuildingForUnWatching),那么根据我们写的逻辑逐一看下。

IBuildingForClass

首先使用onClass()方法,生成了一个类匹配器,可以对需要增强的类进行筛选定位。

IBuildingForBehavior

其次使用onBehavior()方法,生成了一个方法匹配器,可以对类下面需要增强的方法进行筛选定位。

IBuildingForWatching

当我们需要对方法内部执行过程进行监控时,就要使用到观察构建器了,可以对方法执行过程进行观察,此部分功能多用于做Debug平台、覆盖率统计平台。

EventWatcher

最后我们需要通过onWatch()方法生成一个事件观察者包装类,在其build()方法里面,使用全局的模块事件观察者(moduleEventWatcher)生成一个全局watchId,用于事件观察者的全局统一管理。另外一个作用是添加进度监听器,用于观察事件加载进度。

  1. private EventWatcher build(final EventListener listener,
  2. final Progress progress,
  3. f
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/727856
推荐阅读
相关标签
  

闽ICP备14008679号