问题
1、什么是拦截器,做什么的
2、拦截器的逻辑
3、拦截器的实现
解决
1、、
由于动态代理一般比较难理解,程序设计者会设计一个拦截器接口供开发者使用,开发者只要知道拦截器接口的方法、含义和作用即可
2、
开发者提供拦截器,设计者设置拦截器,调用拦截器before()方法
如果返回是false调用拦截器around()方法
如果返回是true,反射原来方法
最后调用拦截器after()方法
3、
定义拦截器接口Interceptor
public interface Interceptor{
public boolean before(Object proxy,Object target, Method method, Object [] args);
//在before方法返回false的情况下,调用around方法
public void around(Object proxy, Object target,Method method,Object [] args);
public void after(Object proxy,Object target,Method method, Object [] args);
}
MyInterceptor
public class MyInterceptor implements Interceptor{
public boolean before(Object proxy,Object target,Method method,Object [] args){
System.err.println("反射方法前的逻辑");
return false;//不反射被代理对象原有对象
}
public void after(Object proxy,Object target,Method method , Object [] args){
System.err.println("反射方法后逻辑");
}
public void around(Object proxy, Object target,Method method,Object [] args){
System.err.println("取代了被代理对象的方法");
}
在JDK动态代理中使用拦截器
public class InterceptorJdkProxy implements InvocationHandler{
private Object = null;//真实对象
private String interceptorClass = null;//拦截器全限定名
public InterceptorJdkProxy (Object target,String interceptorClass){
this.target = target ;
this.interceptorClass = interceptorClass;
}
public static Object bind(Object target, String interceptorClass){
//取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoaser(),
target.getClass().getInterfaces(),
new InterceptorJdkProxy(target,interceptorClass());
}
public Object invoke(Object target, Method method,Object [] args) throws Throwable{
if(interceptorClass == null){
//如果没有设置拦截器则直接反射原来的方法
return method.invoke(target, args);
}
Object result = null;
//通过反射生成拦截器
Interceptor interceptor =
(Incerceptor) Class.forName(interceptorClass).newInstance();
//调用前置方法
if(interceptor.before(proxy,target,method,args)){
//反射原有对象方法
result = method.invoke(target,args);
}else{//返回false执行around方法
interceptor.around(proxy,target,method,args);
}
//调用后置方法
interceptor.after(proxy,target,method,args);
return result;
}
public static void main(String [] args){
HelloWorld proxy = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),
"com.lean.ssm.chapter2.interceptor.MyInterceptor");
proxy.sayHelloWorld();
}
原文:https://www.cnblogs.com/quenvpengyou/p/12820024.html