如果我们需要根据方法的参数不同而决定事都进行切入,而不是不管方法是什么参数全部切入的话,我们就需要使用动态切入点,在每次方法调用时候都进行检查(确切的说是参数检查),;来决定是否执行通知
BeanOne.java
动态切入点:
环绕通知:
测试代码:
运行结果:
100
-------------------
before
101
after
-------------------
bar-one
后记
如果我们在切入点类中的方法检查代码中加入提示,如:
可以看到结果如下:
static check for dynamic
static check for bar
static check for foo
static check for clone
static check for toString
static check for dynamic
dynamic check for dynamic
100
-------------------
dynamic check for dynamic
before
101
after
-------------------
static check for bar
bar-one
可以看到,红色部分代表静态方法类型检查,绿色代表动态方法类型检查
当我们实现了静态检查|(public boolean matches(Method method, Class cls) )时候,动态类型对不匹配的方法,如本例中的bar不再进行动态检查,提高了效率,如果没有public boolean matches(Method method, Class cls) 方法,则所有方法势必都会进行类型检查,不仅降低效率,还有可能因为方法参数的不同导致异常(如bar是没有参数的,使用动态检查中的 int x=((Integer)obj[0]).intValue();就会出现异常)