zoukankan      html  css  js  c++  java
  • 滴水穿石Java动态代理

      动态代理类实现InvocationHandler接口,利用反射机制,动态地生成代理对象及其调用方法。提高了代码的可扩展性和可维护性,更加符合OCP原则。
    继续使用《Java静态代理》中的实例。

    UserManager.java

    /**
    * 定义UserManager接口,包含对用户增删改查四个抽象方法
     * @author Administrator
     *
     */
    public interface UserManager {
        
       public void addUser(String username,String password);
       
        public void deleteUser(int id);
        
        public void modifyUser(int id,String username,String password);
        
        public String findUserById(int id);
    }

    UserManagerImpl.java

    /**
     * 实现UserManager接口的具体类
     * @author Administrator
     *
     */
    public class UserManagerImpl implements UserManager {
        public void addUser(String username, String password) {
            System.out.println("UserManagerImpl.addUser()...");
        }
        public void deleteUser(int id) {
            System.out.println("UserManagerImpl.deleteUser()...");
        }
        public String findUserById(int id) {
            System.out.println("UserManagerImpl.findUserById()...");
            return null;
        }
        public void modifyUser(int id, String username, String password) {
            System.out.println("UserManagerImpl.modifyUser()...");
        }
    }

    SecurityHandler.java---实现InvocationHandler接口。

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class SecurityHandler implements InvocationHandler {
        private Object targetObject;
        
        public Object newProxy(Object targetObject) {
            this.targetObject = targetObject;
            //调用Proxy中的静态方法newProxyInstance()
            /**
             * loader - 定义代理类的类加载器
             * interfaces - 代理类要实现的接口列表
             * h - 指派方法调用的调用处理程序,即SecurityHandler类
             */
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                                        targetObject.getClass().getInterfaces(), this);
        }
        /**
         * proxy - 代理实例
         * method - 对应于在代理实例上调用的接口方法的 Method 实例。
         * args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数
         * 被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
         */
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            checkSecurity();
            Object ret = null;//接收调用方法的返回值
            try {
                ret = method.invoke(targetObject, args);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ret;
        }
        
        private void checkSecurity(){
            System.out.println("SecurityHandler.checkSecurity()...");
        }
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            /*UserManager userManager = new UserManagerImpl();
            userManager.addUser("zhangsan", "111");*/
            UserManager userManager = (UserManager)new SecurityHandler().newProxy(
                    new UserManagerImpl());
            userManager.addUser("zhangsan", "111");
        }
    }

    运行结果:
    SecurityHandler.checkSecurity()...
    UserManagerImpl.addUser()...

  • 相关阅读:
    windows下安装redis
    关于 tomcat 集群中 session 共享的三种方法
    利用Nginx做负载均衡
    Spring4 MVC Hibernate4集成
    <mvc:annotation-driven />到底帮我们做了啥
    Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别
    JPA注解指南
    Hibernate与Jpa的关系
    ActiveMQ实现负载均衡+高可用部署方案
    信号接口-视频输出端口介绍
  • 原文地址:https://www.cnblogs.com/nexiyi/p/2806372.html
Copyright © 2011-2022 走看看