版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zen99T/article/details/88934048
简介
待补充…
step1:业务组件接口
package me.jtzen9;
public interface UserService {
void sayHelloWorld();
}
step2:业务组件实现类
package me.jtzen9;
public class UserServiceImpl implements UserService {
@Override
public void sayHelloWorld() {
System.out.println("hello world");
}
}
step3:拦截器接口
package me.jtzen9.interceptor;
import java.lang.reflect.Method;
public interface Interceptor {
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);
}
step4:拦截器实现类
package me.jtzen9.interceptor;
import java.lang.reflect.Method;
public class InterceptorImpl implements Interceptor {
@Override
public boolean before(Object proxy, Object target, Method method, Object[] args) {
System.out.println("反射方法前逻辑");
return false;
}
@Override
public void around(Object proxy, Object target, Method method, Object[] args) {
System.out.println("取代了被代理对象的方法");
}
@Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("反射方法后逻辑");
}
}
step5:jdk动态代理结合拦截器
package me.jtzen9.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class InterceptorJdkProxy implements InvocationHandler {
// 真实对象
private Object target;
// 拦截器全限定名
private String interceptorClass = null;
private InterceptorJdkProxy(Object target, String interceptorClass) {
this.target = target;
this.interceptorClass = interceptorClass;
}
public static Object bind(Object target, String interceptorClass) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InterceptorJdkProxy(target,interceptorClass));
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 如果没有设置拦截器,直接反射原方法
if (interceptorClass == null){
return method.invoke(target,args);
}
Object result = null;
Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();
if (interceptor.before(proxy,target,method,args)) {
result = method.invoke(target,args);
} else {
interceptor.around(proxy,target,method,args);
}
interceptor.after(proxy,target,method,args);
return result;
}
}
step6:测试客户端
package me.jtzen9.interceptor;
import me.jtzen9.UserService;
import me.jtzen9.UserServiceImpl;
public class ClientTest {
public static void main(String[] args) {
UserService userServiceProxy = (UserService) InterceptorJdkProxy
.bind(new UserServiceImpl(), "me.jtzen9.interceptor.InterceptorImpl");
userServiceProxy.sayHelloWorld();
}
}
结果
反射方法前逻辑
取代了被代理对象的方法
反射方法后逻辑
参考
- 用 Java 实现拦截器 Interceptor 的拦截功能
- 《Java EE 互联网轻量级框架整合开发——SSM框架和Redis实现》