@Intercepts({@Signature(
类型=执行者。班级,
方法=“更新”,
args={映射语句。类,对象。班级})})
公共类ExamplePlugin实现拦截器{
公共对象拦截(调用调用)抛出Throwable{
返回调用。继续();
}
公共对象插件(对象目标){
返回插件。包装(目标,这个);
}
publicvoidsetProperties(属性属性){
}
}
Interceptor#plugin表示什么时候拦截
Interceptor#intercept拦截的具体操作现在可以在♬上面四个对象创建后,会调用interceptorChain.pluginAll(statementHandler)方法拦截
现在看Plugin#wrap
publicstaticObjectwrap(Objecttarget,Interceptorinterceptor){
Map,Set>signatureMap=getSignatureMap(拦截器);
类<?>类型=目标。得到类();
类<?>[]interfaces=getAllInterfaces(type,signatureMap);
如果(接口。长度>0){
返回Proxy.newProxyInstance(
类型。获取类加载器(),接口,
新插件(目标、拦截器、signatureMap));
}
返回目标;
}
@覆盖
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
尝试{
Setmethods=signatureMap.get(method.getDeclaringClass());
如果(方法!=空&&方法。包含(方法)){
返回拦截器。拦截(新调用(目标,方法,参数));
}
返回方法。调用(目标,参数);
}赶上(异常e){
抛出ExceptionUtil。展开抛出(e);
}
}
可以看出最后返回的也是代理类
参考
https://mp.weixin.qq.com/s/J3ac3WvCXMSZNoYaUGktMwhttps://mp.weixin...