方法拦截器使用SpringAop实现,其实现的底层也是动态代理,用法和动态代理非常相似。
package work.vcloud.voluntary;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;
/**
* 方法拦截器案例
*/
public class Student {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new Student());
proxyFactory.addAdvice(new adviseMethodInterceptor());
Object proxy = proxyFactory.getProxy();
Student methodInterceptor = (Student) proxy;
methodInterceptor.add("张三");
}
/**
* 拦截方法
*/
public static class adviseMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
try {
Object[] arguments = methodInvocation.getArguments();
for (int i = 0; i < arguments.length; i++) {
System.out.println("方法的参数:" + arguments[i]);
}
System.out.println("拦截的对象:" + methodInvocation.getThis());
System.out.println("拦截的方法:" + methodInvocation.getMethod());
System.out.println("方法执行之前");
result = methodInvocation.proceed();
System.out.println("方法执行之后");
System.out.println("方法正常运行结果:" + result);
return result;
} catch (Exception e) {
System.out.println("方法出现异常:" + e);
System.out.println("方法运行Exception结果:" + result);
return result;
}
}
}
public String add(String name) {
//int num = 1 / 0;
System.out.println("添加学生:" + name);
return "添加成功!";
}
}