A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

静态代理的缺点:

代理类中的添加项需要重新书写多次
新增加被代理类时,需要重新写代理类的添加项
动态代理的实现步骤:

编写一个代理工作处理器–代理者要替被代理者做XXX事
要求: 必须实现InvocationHandler
创建代理者的对象
要用到:Proxy工具类,里面有一个方法,可以直接创建代理类的对象
代理类是在JVM中自动生成的一个类型
newProxyInstance三个参数:

类加载器:加载类的工具类,通过这个类的class 对象,就可以创关键
被代理者实现的主题接口们
代理者要替被代理者的工作的处理器
public class TestDynamicProxy{
        public static void main(String[] args) {
                //先获取被代理者的class对象
                Class c = MySqlVersion.class;
                //2.获取他的类加载器对象
                ClassLoader loader = c.getClassLoader();
                //3.创建处理工作的处理器
                MyInvocationHandler my = new  MyInvocationHandler(true, new MySqlVersion());
               
                Object proxyInstance = Proxy.newProxyInstance(loader, c.getInterfaces(), my);
                //转型
                IGoods iGoods = (IGoods) proxyInstance;
                iGoods.add();
                iGoods.delete();
                iGoods.list();
                iGoods.update();
               
                //-------------------------------------------
                Class uc = UserManager.class;
                MyInvocationHandler my2 = new MyInvocationHandler(true,new UserManager());
                IUser iu = (IUser) Proxy.newProxyInstance(uc.getClassLoader(), uc.getInterfaces(), my2);
                iu.add();
                iu.update();
                iu.delete();
                iu.list();
               
        }
}
class MyInvocationHandler implements InvocationHandler{
        private boolean flag ;
        private Object target;
       
        //通过构造器将需要的参数传进来
        public MyInvocationHandler(boolean flag, Object target) {
                super();
                this.flag = flag;
                this.target = target;
        }
        //代理者要替被代理者做的事写在这里:
        /*
                  invoke的三个参数的作用:
                 1.Object proxy:代理对象
                 2.Method metho:被代理者要执的方法
                 3.Object[] args:要传给被代理者执行的方法的是参列表
                 这个方法不是程序员手动改调用的,是在别的类中帮我们调用的
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;//被代理者要执行的方法的返回值,若是void,自动给返回null
                if(flag){
                        System.out.println("开始 记录日志,获取开始时间,权限验证....");
                        result =method.invoke(target,args);
                        System.out.println("结束 记录日志, 获取结束时间, 权限验证...");
                }else{
                        result =method.invoke(target, args);
                }
                return result;
        }
       
}

//新添一个代理接口
interface IUser{
        void add();
        void delete();
        void update();
        void list();
}
//新被代理类
class UserManager implements IUser{

        @Override
        public void add() {
                System.out.println("用户添加..");
        }

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

        @Override
        public void update() {
                System.out.println("用户修改...");
        }

        @Override
        public void list() {
                System.out.println("用户查询...");
        }
       
}

//-----------------------------------------
//代理类接口--主题接口
interface IGoods{
        void add();
        void delete();
        void update();
        void list();
}

//被代理者们
class MySqlVersion implements IGoods{

        @Override
        public void add() {
                System.out.println("mysql版的添加商品");               
        }

        @Override
        public void delete() {
                System.out.println("mysql的删除商品");
        }

        @Override
        public void update() {
                System.out.println("mysql的修改商品");
        }

        @Override
        public void list() {
                System.out.println("mysql的查询商品");
        }
}
class OracleVersion implements IGoods{

        @Override
        public void add() {
                System.out.println("oracle的添加商品");
        }

        @Override
        public void delete() {
                System.out.println("oracle的删除商品");
        }

        @Override
        public void update() {
                System.out.println("oracle的更新商品");
        }

        @Override
        public void list() {
                System.out.println("oracle的查询商品");
        }
}
---------------------
转载,仅作分享,侵删
作者:qq1010234991
原文:https://blog.csdn.net/qq1010234991/article/details/83828741


1 个回复

倒序浏览
奈斯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马