您的位置:首页 > 编程语言 > Java开发

JDK动态代理实现拦截器

2017-12-31 00:00 441 查看

简介

待补充...

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实现》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息