动态代理

作者: jsjack_wang | 来源:发表于2018-01-17 13:02 被阅读0次
    1.使用reflect包中Proxy实现
    Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
        loader: 类加载器,使用AppClassLoader加载器即可
        interfaces: 委托类的所有接口
        invocationHandler: 实现代理需要的一个接口
    
    public interface InvocationHandler {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
    }
        proxy:委托类
        method: 调用的方法
        args: 调用方法的参数
    
    2.具体实现
    2.1 User.java
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class User {
        private String username;
        private String password;
    }
    
    2.2 代理类和委托类都实现的接口
    public interface IUserDao {
        void saveUser(User user);
        int updateUser(User user);
    }
    
    2.3 委托类(如果委托类没有实现接口 需要使用cglib实现动态代理)
    public class UserDaoImpl implements IUserDao {
        @Override
        public void saveUser(User user) {
            System.out.println("UserDaoImpl save user.");
        }
    
        @Override
        public int updateUser(User user) {
            System.out.println("UserDaoImpl update user.");
            return 0;
        }
    }
    
    2.4 代理类
    public class UserDynamicsProxy<T> implements InvocationHandler {
        private T target;
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("proxy before.");
            Object result = method.invoke(target, args);
            System.out.println("proxy after");
            return result;
        }
    
        public T proxy(T target) {
            this.target = target;
            return (T) Proxy.newProxyInstance(UserDynamicsProxy.class.getClassLoader(), target.getClass().getInterfaces(), this);
        }
    }
    
    3.测试
    @Test
    public void testDynamicsProxy() {
        User user = new User();
        IUserDao userDao = new UserDaoImpl();
        IUserDao proxyUserDao = new UserDynamicsProxy<IUserDao>().proxy(userDao);
        proxyUserDao.saveUser(user);
    }
    

    上一篇静态代理:https://www.jianshu.com/u/f18ffbf46091

    相关文章

      网友评论

        本文标题:动态代理

        本文链接:https://www.haomeiwen.com/subject/uqzyoxtx.html