JDK动态代理实现拦截器

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
    }

}

结果

反射方法前逻辑
取代了被代理对象的方法
反射方法后逻辑

参考

猜你喜欢

转载自blog.csdn.net/Zen99T/article/details/88934048