Advice.getParameterArray()拿到的入参有可能已经被方法内部改变过,不再是原有的入业务入参
在这个通知环节,你无法通过Advice.changeParameter(int, Object)来改变方法入参,
因为整个方法已经执行过了,再次改变已经失去了意义
Advice.changeParameter(int, Object)来改变入参,
也可以继续使用ProcessController来改变代码执行流程
Method和ConstructorConstructor和Method提取对应的描述信息。Filter.doMethodFilter(int, String, String[], String[], String[])被调用的时候,
一定是Filter.doClassFilter(int, String, String, String[], String[])上一次返回true的调用。Filter是一个比较原始、暴力、直接的接口,虽然很万能,但要精巧的构造门槛很高!Filter表现形式过于单薄而且纵深扩展能力偏差,所以使用了一些Annotation进行扩展,
扩展之后的结果最终会以ExtFilter的形式在容器内部运转Class.getCanonicalName(),但在遇到不可见类时提取Class.getName()
sandbox-api:1.0.10的时候已经将这个接口披露出来了
所以为了向下兼容API,必须保持Filter的声明。ProcessControlException.throwReturnImmediately(Object)
所引起的返回事件ProcessControlException.throwThrowsImmediately(Throwable)
所引起的异常抛出事件Filter,
将能匹配到来自BootstrapClassLoader所加载的类Filter将能匹配到目标类的子类EventWatchBuilder.onClass(java.lang.Class<?>)所指定的类,检索路径是否包含子类(实现类)
如果onClass()了一个接口,则匹配时会搜索这个接口的所有实现类
如果onClass()了一个类,则匹配时会搜索这个类的所有子类
LoadedClassDataSource.list() 而言,有更优的内存、CPU开销LoadCompleted.loadCompleted()方法比较常用,所以单独出来成为一个接口,
原有方法语意、触发时机保持不变
EventListener将开始收到对应的事件
这里抛出异常将会是阻止模块被激活的唯一方式
onBehavior("*")
onClass("*")
onClass(clazz.getCanonicalName())
事件流转流程
+-------+
| |
+========+ <return> +========+ | <return immediately>
| | <return immediately> | | |
| BEFORE |---------------------->| RETURN |<---+
| | | |
+========+ +========+
| | ^
| <throws immediately> | |
| | | <return immediately>
| v |
| +========+
| | |
+--------------------------->| THROWS |<---+
<throws> | | |
<throws immediately> +========+ | <throws immediately>
| |
+-------+
EventListener将被静默,无法收到对应的事件。EventWatchBuilder 来完成Filter的构建ProcessControlException进行流程控制,但命名不太规范,所以这里重命名一个类
EventListener进行处理
Printer.broken()之后,再次调用本方法将无法阻塞当前线程
有两种场景会打断本次挂起,任何以下场景都能结束并唤醒当前被阻塞的线程
网络I/O被中断
Printer.broken()被调用
Thread.interrupt()被调用
Printer.waitingForBroken()ModuleEventWatcher.watch(Filter, EventListener, Progress, Event.Type...)不一样的地方是,当观察结束时会自动delete观察事件
还原之前观察时被渲染的代码
ModuleEventWatcher.watch(Filter, EventListener, Progress, Event.Type...)不一样的地方是,当观察结束时会自动delete观察事件
还原之前观察时被渲染的代码
AdviceListener.beforeLine(Advice, int)
将会被触发EventWatchBuilder.IBuildingForUnWatching.onUnWatched()方法渲染类的进度
Copyright © 2018 Alibaba Open Source. All rights reserved.