Loading

JDK动态代理的实现

参考:https://www.bilibili.com/video/BV1Vf4y127N5?p=27&spm_id_from=pageDriver&vd_source=27ddd0c2f8614340b1c87724330159a5

UserMapper

public interface UserMapper {
    void add(String username, String password);
}

UserMapperImpl

/**
 * @Author: DengJia
 * @Date: 2022/9/10
 * @Description: JDK动态代理,目标类需要有实现接口,创建接口实现类的代理对象,通过代理对象来增强接口方法!
 */

public class UserMapperImpl implements UserMapper {
    @Override
    public void add(String username, String password) {
        System.out.println("insert into db: [" + username + ", " + password + "]");
    }
}

JDKProxy

/**
 * @Author: DengJia
 * @Date: 2022/9/10
 * @Description: JDK动态代理的实现
 */

public class JDKProxy {
    public static void main(String[] args) {
        UserMapper userMapper = (UserMapper) Proxy.newProxyInstance(
                JDKProxy.class.getClassLoader(),
                new Class[]{UserMapper.class},
                new UserMapperInvocationHandler(new UserMapperImpl())
        );
        userMapper.add("dengjia", "123456");
    }
}

/**
 * 创建代理对象
 */
class UserMapperInvocationHandler implements InvocationHandler {
    private Object obj;

    public UserMapperInvocationHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 方法之前
        System.out.println("被增强的方法执行 之前!");

        // 被增强的方法执行
        Object res = method.invoke(obj, args);

        // 方法之后
        System.out.println("被增强的方法执行 之后!");

        return res;
    }
}

posted @ 2022-09-10 15:56  溫柔の風  阅读(135)  评论(0编辑  收藏  举报