Java 动态代理

InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。

1.定义一个接口类

public interface IUserService {
    public void addUser();
    public void readUser();
    public void deleteUser();
}

2.接口的实现类

public class UserServiceImpl implements IUserService {
    public void addUser() {
        System.out.println("add user");
    }

    public void readUser() {
        System.out.println("read user");
    }

    public void deleteUser() {
        System.out.println("delete user");
    }
}

3.1动态代理定义一个InvocationHandler,在静态代理中就相当于Proxy类的作用

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


//java 动态代理需实现InvocationHandler   ,   InvocationHandler 实际在静态代理中就是起到Proxy类的作用
public class LogInvocationHandler implements InvocationHandler {
    private Object service;
    public void setService(Object service){
        this.service = service;
    }
    //所有代理类方法在执行的时候都会回调这个函数
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("[Log]:"+method.getName()+"called");
        Object ret = method.invoke(this.service,args);
        System.out.println("[Log]:"+method.getName()+"done");
        return ret;
    }
}

3.2静态代理

//代理类也要实现接口,并创建设置
// 接口对象
public class LogUserServiceProxy implements IUserService {
    private IUserService userService;
    public void setUserService(IUserService userService){
        this.userService = userService;
    }
    public void addUser() {
        System.out.println("[log] addUser called");
        this.userService.addUser();
    }

    public void readUser() {
        System.out.println("[log] readUser called");
        this.userService.readUser();
    }

    public void deleteUser() {
        System.out.println("[log] deleteUser called");
        this.userService.deleteUser();
    }
}

4.实现动态代理类,每次调用IUserService proxy的具体方法。如addUser、deleteUser、readUser都会回调LogInvocationHandler中的invoke函数。invoke函数中的proxy具体的含义代表实现接口类的实例 proxy: "UserServiceImpl@5479",可以参考https://blog.csdn.net/yaomingyang/article/details/81040390

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;

public class Test1 {
    public static void main(String[] args) {
        IUserService service = new UserServiceImpl();
        LogInvocationHandler handler = new LogInvocationHandler();
        handler.setService(service);
        //getProxyClass(classLoader,接口的类)
        Class<?> proxyClass = Proxy.getProxyClass(service.getClass().getClassLoader(), IUserService.class);
        try {
            IUserService proxy = (IUserService) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
            proxy.addUser();
            proxy.deleteUser();
            proxy.readUser();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

5.输出

[Log]:addUsercalled
add user
[Log]:addUserdone
[Log]:deleteUsercalled
delete user
[Log]:deleteUserdone
[Log]:readUsercalled
read user
[Log]:readUserdone
Process finished with exit code 0

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容