📄 aophandler.java
字号:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class AOPHandler implements InvocationHandler {
private List <Interceptor>interceptors = null;
private Object originalObject;
/**
* 返回动态代理实例
*
* @param obj
* @return
*/
public Object bind(Object obj) {
this.originalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
}
/**
* 在Invoke方法中,加载对应的Interceptor,并进行
* 预处理(before)、后处理(after)以及异常处理(exceptionThrow)过程
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
Throwable ex = null;
InvocationInfo invInfo = new InvocationInfo(proxy, method, args,
result, ex);
System.out.println("Invoking Before Intercetpors!");
invokeInterceptorsBefore(invInfo);
try {
System.out.println("Invoking Proxy Method!");
result = method.invoke(originalObject, args);
invInfo.setResult(result);
System.out.println("Invoking After Method!");
invokeInterceptorsAfter(invInfo);
} catch (Throwable tr) {
invInfo.setException(tr);
System.out.println("Invoking exceptionThrow Method!");
invokeInterceptorsExceptionThrow(invInfo);
throw new AOPRuntimeException(tr);
}
return result;
}
/**
* 加载Interceptor
*
* @return
*/
private synchronized List <Interceptor>getIntercetors() {
if (null == interceptors) {
interceptors = new ArrayList<Interceptor>();
//这里必须实现,不然没有数据,无法实现
//1 TODO:读取配置,加载Interceptor实例
// 2 interceptors.add(new MyInterceptor());
}
return interceptors;
}
/**
* 执行预处理方法
*
* @param invInfo
*/
private void invokeInterceptorsBefore(InvocationInfo invInfo) {
List <Interceptor>interceptors = getIntercetors();
int len = interceptors.size();
for (int i = 0; i < len; i++) {
((Interceptor) interceptors.get(i)).before(invInfo);
}
}
/**
* 执行后处理方法
*
* @param invInfo
*/
private void invokeInterceptorsAfter(InvocationInfo invInfo) {
List <Interceptor>interceptors = getIntercetors();
int len = interceptors.size();
for (int i = len - 1; i >= 0; i--) {
interceptors.get(i).after(invInfo);
}
}
/**
* 执行异常处理方法
*
* @param invInfo
*/
private void invokeInterceptorsExceptionThrow(InvocationInfo invInfo) {
List <Interceptor>interceptors = getIntercetors();
int len = interceptors.size();
for (int i = len - 1; i >= 0; i--) {
interceptors.get(i).exceptionThrow(invInfo);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -