首页 > 其他 > 详细

动态代理

时间:2020-04-27 21:04:48      阅读:42      评论:0      收藏:0      [点我收藏+]

一、方法和接口

public interface UserDao {
    //保存
    public void save();
    public void delete();
}
public class UserDaoImpl implements UserDao{

    @Override
    public void save() {
        System.out.println("保存用户");
    }

    @Override
    public void delete() {
        System.out.println("删除用户");
    }

}

二、代理工厂

/**
 * 代理工厂
 * 作用:创建代理类和代理对象
 * @author Administrator
 *
 */
public class ProxyFactory {
    //声明目标对象
        private Object target;
        
        public ProxyFactory(Object target) {
            this.target = target;
        }
        /**
         * 得到代理对象
         * @return
         */
        public Object getProxyInstance() {
            /**
             * 参数说明
             * ClassLoader loader  , 类加载器
             * Class<?>[] interfaces,  目标类所实现的所有接口数组
             * InvocationHandler h , 当代理对象被创建之后,调用目标对象的方法时触发的方法回调
             */
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), 
                    new InvocationHandler() {
                        /**
                         * proxy 代理对象
                         * method 用户要调用的目标对象的方法
                         * args 目标对象的方法的参数
                         */
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            begin();//前置加强
                            //执行目标对象的方法
                            Object invoke = method.invoke(target, args);
                            commit();//后置加强
                            return invoke;
                        }
                    });
        }
        private void commit() {
            System.out.println("提交事务");
        }
        private void begin() {
            System.out.println("得到session");
            System.out.println("开启事务");
        }
}

三、测试

public class Test {
    public static void main(String[] args) {
        //创建目标对象
        UserDao userDao = new UserDaoImpl();
        //创建代理工厂对象
        ProxyFactory daoFactory = new ProxyFactory(userDao);
        //得到代理对象
        UserDao proxyDao = (UserDao) daoFactory.getProxyInstance();
        proxyDao.save();
    }
}

 

动态代理

原文:https://www.cnblogs.com/97guoxiang/p/12789865.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!