实现MethodInterceptor 接口,在调用目标对象的方法时,就可以实现在调用方法之前、调用方法过程中、调用方法之后对其进行控制。
MethodInterceptor 接口可以实现MethodBeforeAdvice接口、AfterReturningAdvice接口、ThrowsAdvice接口这三个接口能够所能够实现的功能,但是应该谨慎使用MethodInterceptor 接口,很可能因为一时的疏忽忘记最重要的MethodInvocation而造成对目标对象方法调用失效,或者不能达到预期的设想。
实例1:
public class AdviseMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("方法执行之前:" + methodInvocation.getMethod().toString());
Object result = methodInvocation.proceed();
System.out.println("方法执行之后:" + methodInvocation.getMethod().toString());
return result;
}
}
public class BeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("前置增强====================》");
}
}
public class AfterAdvice implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("后置增强==================》");
}
}
public class ExceptionAdvice implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
System.out.println("异常====================》");
}
}
public class User {
public void helloWorld() {
System.out.println("你好!");
}
public void Error() {
throw new RuntimeException("Error");
}
}
public class Main {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new User());
proxyFactory.addAdvice(new AdviseMethodInterceptor());
proxyFactory.addAdvice(new BeforeAdvice());
proxyFactory.addAdvice(new AfterAdvice());
proxyFactory.addAdvice(new ExceptionAdvice());
User proxyUser = (User) proxyFactory.getProxy();
proxyUser.helloWorld();
proxyUser.Error();
}
}
结果:
方法执行之前:public void www.User.helloWorld()
前置增强====================》
你好!
后置增强==================》
方法执行之后:public void www.User.helloWorld()
方法执行之前:public void www.User.Error()
前置增强====================》
异常====================》
Exception in thread "main" java.lang.RuntimeException: Error