1 ProxyInvocationHandler实现Invocationhandler接口并增强
package com.monika.main.system.util.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Set;
/**
* <p></p>
*/
public abstract class ProxyInvocationHandler<T> implements InvocationHandler {
T target;
Set<String> excludeMethods;
/**
*
* @param target 被代理对象
* @param excludeMethods 非代理方法
*/
public ProxyInvocationHandler(T target, Set<String> excludeMethods) {
this.target = target;
this.excludeMethods = excludeMethods;
}
/**
* 前置动作
* @param target
* @param method
* @param args
*/
public abstract void before(T target,Method method, Object[] args);
/**
* 后置动作
* @param target
* @param method
* @param args
* @param result
*/
public abstract void after(T target,Method method, Object[] args,Object result);
/**
* 异常处理
* @param target
* @param method
* @param args
* @param t
*/
public abstract void exception(T target,Method method, Object[] args,Throwable t);
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(excludeMethods != null && excludeMethods.contains(method.getName())){
return method.invoke(target,args);
}
try {
before(target,method,args);
Object result = method.invoke(target, args);
after(target,method,args,result);
return result;
}catch (Throwable t){
exception(target,method,args,t);
throw t;
}
}
}
2 动态代理工具类
package com.monika.main.system.util.aop;
import java.lang.reflect.Proxy;
/**
* <p></p>
*/
public class ProxyUtil {
/**
*
* @param invocationHandler
* @param interfaces
* @param <T>
* @return
*/
public static <T> T createProxy(ProxyInvocationHandler<T> invocationHandler,Class<T>... interfaces){
return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),interfaces,invocationHandler);
}
}
3 测试代理ArrayList
package com.primal.util;
public class UtilTest {
public static void main(String[] args) {
List proxy = ProxyUtil.createProxy(new ProxyInvocationHandler<List>(new ArrayList(), null) {
@Override
public void before(List target, Method method, Object[] args) {
System.out.println("开始执行>>>"+method.getName());
}
@Override
public void after(List target, Method method, Object[] args, Object result) {
System.out.println("执行"+method.getName()+"的结果>>>"+result);
System.out.println("执行完毕>>>"+method.getName());
}
@Override
public void exception(List target, Method method, Object[] args, Throwable t) {
System.out.println("异常处理");
}
}, List.class);
proxy.add("123");
proxy.forEach(System.out::println);
}
}
4 执行结果
5 原理讲解
后面补上。。。。