-
Notifications
You must be signed in to change notification settings - Fork 1.6k
EVENT INTRODUCE
luanjia edited this page Mar 5, 2019
·
3 revisions
在JVM-Sandbox的世界观中,任何一个Java方法的调用都可以分解为
BEFORE
、RETURN
和THROWS
三个环节,由此在三个环节上引申出对应环节的事件探测
和流程控制机制
- BEFORE事件:执行方法体之前被调用
- RETURN事件:执行方法体返回之前被调用
- THROWS事件:执行方法体抛出异常之前被调用
为了记录代码调用行记录,增加了一个LineEvent
- LINE事件:方法行被执行后调用,目前仅记录行号
CALL事件系列是从GREYS中衍生过来的事件,它描述了一个方法内部,调用其他方法的过程。整个过程可以被描述成为三个阶段
- CALL_BEFORE事件:一个方法被调用之前
- CALL_RETURN事件:一个方法被调用正常返回之后
- CALL_THROWS事件:一个方法被调用抛出异常之后
监听foo方法的BEFORE、RETURN、THROWS、LINE、CALL_BEFORE、CALL_RETURN、CALL_THROWS事件
void foo(){
// BEFORE-EVENT
try {
/*
* do something...
*/
try{
//LINE-EVENT
//CALL_BEFORE-EVENT
a();
//CALL_RETURN-EVENT
} catch (Throwable cause) {
// CALL_THROWS-EVENT
}
//LiNE-EVENT
// RETURN-EVENT
return;
} catch (Throwable cause) {
// THROWS-EVENT
}
}
严格意义上,
IMMEDIATELY_RETURN
和IMMEDIATELY_THROWS
不是事件,他们是流程控制机制
,由com.alibaba.jvm.sandbox.api.ProcessControlException的throwReturnImmediately(Object)和throwThrowsImmediately(Throwable)触发,完成对方法的流程控制
- IMMEDIATELY_RETURN:立即调用:RETURN事件
- IMMEDIATELY_THROWS:立即调用:THROWS事件
+-------+
| |
+========+ <return> +========+ | <return immediately>
| | <return immediately> | | |
| BEFORE |---------------------->| RETURN |<---+
| | | |
+========+ +========+
| | ^
| <throws immediately> | |
| | | <return immediately>
| v |
| +========+
| | |
+--------------------------->| THROWS |<---+
<throws> | | |
<throws immediately> +========+ | <throws immediately>
| |
+-------+
JVM沙箱偏向于底层产品,受众面比较窄,问题反馈沟通很可能会因为各种原因造成不及时。所以我们建立了一个钉钉小群,方便大家在这里进行沟通。