赞
踩
目录
3. 形变器(SandboxClassFileTransformer)
此篇主要解析代码编制部分源码,涉及少部分EveneListener和事件分发处理。
当我们在使用JVM-Sandbox编写模块时,通常会编写类似这种代码:
会发现增强后的业务代码的都是这样:
以Spy.spyMethodOnBefore为例
其实际调用的是spyHandler.handleOnBefore方法,看下方法的Javadoc如下:
- /**
- * 处理方法调用:调用之前
- * <p>BEFORE</p>
- *
- * @param listenerId 事件监听器ID
- * @param targetClassLoaderObjectID 类所在ClassLoader
- * @param argumentArray 参数数组
- * @param javaClassName 类名
- * @param javaMethodName 方法名
- * @param javaMethodDesc 方法签名
- * @param target 目标对象实例
- * @return Spy流程控制结果
- * @throws Throwable 处理{方法调用:调用之前}失败
- */
- Spy.Ret handleOnBefore(int listenerId, int targetClassLoaderObjectID, Object[] argumentArray, String javaClassName, String javaMethodName, String javaMethodDesc, Object target) throws Throwable;
此时,你是否心中有很多疑问,这些代码它是怎么到业务代码里面去的,里面的各种id是如何生成的?怎么跟我们通过Sandbox-Api写的代码关联起来的?
那么接下来看看JVM-Sandbox是如何进行源码增强,具体步骤是如何,增强过程涉及到哪些定义的组件,各组件起到什么作用。
在我们编写的代码里,都会使用事件观察者(ModuleEventWatcher)。那么我们就从事件观察者构建器开始:
构建器处于包com.alibaba.jvm.sandbox.api.listener.ext下,从上图可以看到观察者构建器主要作用是构建类匹配器(IBuildingForClass)、构建方法匹配器(IBuildingForCBehavior)、构建观察构建器(IBuildingForWatching)、删除观察构建器(IBuildingForUnWatching),那么根据我们写的逻辑逐一看下。
首先使用onClass()方法,生成了一个类匹配器,可以对需要增强的类进行筛选定位。
其次使用onBehavior()方法,生成了一个方法匹配器,可以对类下面需要增强的方法进行筛选定位。
当我们需要对方法内部执行过程进行监控时,就要使用到观察构建器了,可以对方法执行过程进行观察,此部分功能多用于做Debug平台、覆盖率统计平台。
最后我们需要通过onWatch()方法生成一个事件观察者包装类,在其build()方法里面,使用全局的模块事件观察者(moduleEventWatcher)生成一个全局watchId,用于事件观察者的全局统一管理。另外一个作用是添加进度监听器,用于观察事件加载进度。
- private EventWatcher build(final EventListener listener,
- final Progress progress,
- f
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。