1.设计拦截器接口 (名字随意,这里用 DikoInterceptor)
public interface DikoInterceptor {
boolean before(Object proxy, Object target, Method method,Object[] args);
void around(Object proxy, Object target, Method method,Object[] args);
void after(Object proxy, Object target, Method method,Object[] args);
}
2.创建JDK动态代理,设计拦截器逻辑
public class InterceptorJdkProxy implements InvocationHandler {
private Object target; //真实对象
private String interceptorName; //拦截器类全限定名
public InterceptorJdkProxy(Object target,String interceptorName){
this.target = target;
this.interceptorName = interceptorName;
}
/**
* 绑定委托对象并返回代理对象
* @param target 真实对象
* @param interceptorName 全限定名
* @return 代理对象
*/
public static Object bind(Object target,String interceptorName){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InterceptorJdkProxy(target,interceptorName));
}
/**
* 拦截器逻辑
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//如果没有设置拦截器全限定名直接反射原有方法
if(interceptorName == null){
return method.invoke(target,args);
}
//定义返回对象
Object result = null;
//通过反射生成拦截器
DikoInterceptor dikoInterceptor = (DikoInterceptor) Class.forName(interceptorName).newInstance();
//调用拦截器前置方法
if(dikoInterceptor.before(proxy,target,method,args)){
//前置方法返回true时,反射原有对象方法
result = method.invoke(target,args);
}
else{
//前置方法返回false时,执行around方法
dikoInterceptor.around(proxy,target,method,args);
}
//调用后置方法
dikoInterceptor.after(proxy,target,method,args);
return result;
}
}
3.开发者实现拦截器接口
public class MyDikoInterceptor implements DikoInterceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("before...");
//...逻辑处理...
return true;
}
@Override
public void around(Object proxy, Object target, Method method, Object[] args) {
System.out.println("around...");
}
@Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("after...");
}
/**
* 测试
* @param args
*/
public static void main(String[] args){
SayHello sayHello = (SayHello)InterceptorJdkProxy.bind(new SayHelloImpl(),"com.example.reflect.Interceptor.MyDikoInterceptor");
sayHello.sayHello();
}
}
4.运行结果
当前置方法返回true时:
当前置方法返回false时: