动态代理

2020-11-26  本文已影响0人  i小雨

JDK动态代理:

需要了解两个类:Proxy(代理)、InvocationHandler(调用处理程序)
接口:

public interface UserService {
    void addUser();
    void deleteUser();
    void updateUser();
    void selectUser();
}

实现类:

public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("增加了一个User");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除了一个User");
    }

    @Override
    public void updateUser() {
        System.out.println("修改了一个User");
    }

    @Override
    public void selectUser() {
        System.out.println("查询了一个User");
    }
}

创建处理程序类:

//用这个类自动生成动态代理类!
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口(直接写object可以使该类变为通用的)
    private Object target;
    public void setTarget(Object target){
        this.target = target;
    }

    //得到生成的代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);

        log(method.getName());//方法增强(记录日志)
        return result;
    }

    //增强方法
    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

测试类:

public class TestProxy {
    public static void main(String[] args) {

        //真实角色
        UserService userService = new UserServiceImpl();

        //代理角色,不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(userService);//设置要代理的对象

        //动态生成代理类
        UserService proxy = (UserService) pih.getProxy();

        proxy.addUser();
        proxy.deleteUser();
        proxy.updateUser();
        proxy.selectUser();

    }
}

结果:

增加了一个User
执行了addUser方法
删除了一个User
执行了deleteUser方法
修改了一个User
执行了updateUser方法
查询了一个User
执行了selectUser方法
上一篇下一篇

猜你喜欢

热点阅读