• Java反射机制剖析(三)-简单谈谈动态代理


    通过Java反射机制剖析(一)Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制。

    1.     代理模式

    代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途。

     

    它 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会 存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

     

    2.     分类

    代理类按照创建时期可以分为两种,静态代理类和动态代理类。

    静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

     

    动态代理类:在程序运行时,运用反射机制动态创建而成。

     

    3.     静态代理和动态代理举例

     

    静态代理:

     

    业务接口类:

        package com.bjpowernode.pattern;  
          
        public interface UserManager {  
          
            public void addUser(String userId, String userName);  
              
            public void delUser(String userId);  
              
            public void modifyUser(String userId, String userName);  
              
            public String findUser(String userId);  
        }  

    业务接口实现类:

        package com.bjpowernode.pattern;  
          
        public class UserManagerImpl implements UserManager {  
          
            public void addUser(String userId, String userName) {  
                //System.out.println("start-->>addUser() userId-->>" + userId);  
                try {  
                    System.out.println("UserManagerImpl.addUser() userId-->>" + userId);  
                      
                    //System.out.println("success-->>addUser()");  
                }catch(Exception e) {  
                    e.printStackTrace();  
                    //System.out.println("error-->>addUser()");  
                    throw new RuntimeException();  
                }     
            }  
          
            public void delUser(String userId) {  
                System.out.println("UserManagerImpl.delUser() userId-->>" + userId);  
            }  
          
            public String findUser(String userId) {  
                System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
                return "张三";  
            }  
          
            public void modifyUser(String userId, String userName) {  
                System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId);  
            }  
          
        }  

    业务代理类:

        package com.bjpowernode.pattern;  
          
        public class UserManagerImplProxy implements UserManager {  
          
            private UserManager userManager;  
              
            public UserManagerImplProxy(UserManager userManager) {  
                this.userManager = userManager;  
            }  
              
            public void addUser(String userId, String userName) {  
                try {  
                    System.out.println("start-->>addUser() userId-->>" + userId);  
                    userManager.addUser(userId, userName);  
                    System.out.println("success-->>addUser()");  
                }catch(Exception e) {  
                    e.printStackTrace();  
                    System.out.println("error-->>addUser()");  
                }     
            }  
          
            public void delUser(String userId) {  
          
            }  
          
            public String findUser(String userId) {  
                return null;  
            }  
          
            public void modifyUser(String userId, String userName) {  
          
            }  
          
        }  

    客户端类:

        package com.bjpowernode.pattern;  
          
        public class Client {  
          
            /** 
             * @param args 
             */  
            public static void main(String[] args) {  
                //UserManager userManager = new UserManagerImpl();  
                UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());  
                userManager.addUser("0001", "张三");  
            }  
          
        }  

    运行结果:

        start-->>addUser() userId-->>0001  
        UserManagerImpl.addUser() userId-->>0001  
        success-->>addUser()  

    动态代理:

    业务接口类:

        package com.bjpowernode.pattern;  
          
        public interface UserManager {  
          
              
            public String test(String userId);  
        }  

    业务接口实现类:

        package com.bjpowernode.pattern;  
          
        public class UserManagerImpl implements UserManager {  
          
            public String test(String userId) {  
                System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
                return "张三";  
            }  
          
        }  

    BusinessHandler类:

        package com.bjpowernode.pattern;  
          
        import java.lang.reflect.InvocationHandler;  
        import java.lang.reflect.Method;  
        import java.lang.reflect.Proxy;  
          
        public class BusinessHandler implements InvocationHandler {  
              
            private Object targetObject;  
              
            public Object newProxyInstance(Object targetObject) {  
                  
                this.targetObject = targetObject;  
                return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
                                       targetObject.getClass().getInterfaces(), this);  
            }  
              
            public Object invoke(Object proxy, Method method, Object[] args)  
                    throws Throwable {  
                System.out.println("start-->>" + method.getName());  
                for (int i=0; i<args.length; i++) {  
                    System.out.println(args[i]);  
                }  
                Object ret = null;  
                try {  
                    //调用目标方法  
                    ret = method.invoke(targetObject, args);  
                    System.out.println("success-->>" + method.getName());   
                }catch(Exception e) {  
                    e.printStackTrace();  
                    System.out.println("error-->>" + method.getName());  
                    throw e;  
                }  
                return ret;  
            }  
          
        }  

    客户端类:

        package com.bjpowernode.pattern;  
          
        import java.lang.reflect.Field;  
          
          
        public class Client {  
          
            /** 
             * @param args 
             */  
            public static void main(String[] args) {  
                  
                BusinessHandler businessHandler = new BusinessHandler();  
                UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl());  
                  
                  
                  
                //userManager.addUser("0001", "张三");  
                //userManager.delUser("0001");  
               // System.out.println(userManager.getClass().getName());  
                  
                String name = userManager.test("0001");  
            //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001");  
                System.out.println("Client.main() --- " + name);  
            }  
          
        }  

    结果

        start-->>test  
        0001  
        UserManagerImpl.findUser() userId-->>0001  
        success-->>test  
        Client.main() --- 张三  
  • 相关阅读:
    利用朴素贝叶斯算法进行分类-Java代码实现
    机器学习项目中常见的误区
    Chromium项目文化
    又一次定义CDN:为什么是迅雷?
    程序猿的思维修炼
    linux杂谈(十二):CDN加速
    Run-Time Check Failure #2
    打开excel2007&quot;向程序发送命令时出现故障&quot;
    [Unity 3D] Quaternion.LookRotation
    具体解释 IBM Bluemix 端到端开发体验
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4253304.html
Copyright © 2020-2023  润新知