• 静态代理和动态代理


    一、代理的分类

      按照代理对象创建时期的不同,代理类可以分为两种:

      1、静态代理:由程序员手动创建代理类或者使用特定工具自动生成源代码,然后对源代码进行编译,在程序运行之前代理类的.class文件就已经存在了.

      2、动态代理:在程序运行期间使用反射技术动态的创建.

    、静态代理实现

      1、首先定义一个接口  UserService

    public interface UserService {
        public abstract void register();
        public abstract void login();
    }
    

      2、目标类(被代理类)实现UserService接口

    public class UserServiceImpl implements UserService {
    
        @Override
        public void register() {
            System.out.println("用户正在使用注册功能.....");
        }
    
        @Override
        public void login() {
            System.out.println("用户正在使用登录功能.....");
        }
    }
    

      3、定义一个静态代理类(StaticProxy)也实现UserService接口,通过组合和有参数构造方法引入UserServiceImpl实例,并添加增强的功能  

    public class StaticProxy implements UserService {
        // 使用组合的方式引入UserService的实例
        private UserService userService;
        // 通过构造方法引入UserServiceImpl
        public StaticProxy(UserService userService){
            this.userService = userService;
        }
    
        @Override
        public void register() {
            System.out.println("开始增加日志功能");
            userService.register();
            System.out.println("日志功能添加完毕");
        }
    
        @Override
        public void login() {
            System.out.println("开始增加异常处理功能");
            userService.login();
            System.out.println("异常处理功能添加完毕");
        }
    }
    

      4、测试类

    public class TestProxy {
        public static void main(String[] args) {
            UserService userService = new UserServiceImpl();
            StaticProxy staticProxy = new StaticProxy(userService);
            staticProxy.register();
            System.out.println("***************************");
            staticProxy.login();
        }
    }
    

      5、测试结果

    开始增加日志功能
    用户正在使用注册功能.....
    日志功能添加完毕
    ***************************
    开始增加异常处理功能
    用户正在使用登录功能.....
    异常处理功能添加完毕
    

      

    三、动态代理实现 

      1、首先定义一个接口  UserService  

    public interface UserService {
        public abstract String register();
        public abstract void login();
    }
    

      2、目标类(被代理类)实现UserService接口

    public class UserServiceImpl implements UserService {
    
        @Override
        public String register() {
            System.out.println("用户正在使用注册功能.....");
            return "xiaomaomao!!!";
        }
    
        @Override
        public void login() {
            System.out.println("用户正在使用登录功能.....");
        }
    }

      3、创建一个动态代理类实现IncocationHandler接口

    public class DynamicProxy implements InvocationHandler {
        // 通过组合的方式传入目标对象
        private Object obj;
    
        public DynamicProxy(Object obj) {
            this.obj = obj;
        }
        
        // proxy:目标对象  
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object returnValue = null;
            // 根据不同的方法名来筛选,对不同的方法进行不同的增强
            String name = method.getName();
            if ("register".equals(name)) {
                System.out.println("开始增加日志功能");
                returnValue = (String) method.invoke(obj, args);
                System.out.println("日志功能添加完毕");
            } else if ("login".equals(name)) {
                System.out.println("开始增加异常处理功能");
                returnValue = method.invoke(obj, args);
                System.out.println("异常处理功能添加完毕");
            }
            return returnValue;
        }
    }
    

      4、测试类

    public class TestProxy {
        public static void main(String[] args) {
            UserService userService = new UserServiceImpl();
            // 返回的代理对象实际上就是UserService的实现类对象
            UserService proxy = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
                    userService.getClass().getInterfaces(), new DynamicProxy(userService));
            String value = proxy.register();
            System.out.println("****************************");
            proxy.login();
            System.out.println(value);
        }
    }
    

      5、测试结果

    开始增加日志功能
    用户正在使用注册功能.....
    日志功能添加完毕
    ****************************
    开始增加异常处理功能
    用户正在使用登录功能.....
    异常处理功能添加完毕
    xiaomaomao!!!
    

      

      

  • 相关阅读:
    进程隐藏类
    MFC中一些使用的方法
    c++/vc++的一些学习方法
    随意更改桌面壁纸
    Winsock异步模型之(事件通知模型 WSAAsyncSelect)
    开发外挂的一些原理
    ios 图片
    得到cell的坐标
    取出字符串中的空格
    ios 获取当前的日期,年月日
  • 原文地址:https://www.cnblogs.com/xiaomaomao/p/13492553.html
Copyright © 2020-2023  润新知