• 滴水穿石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()...

  • 相关阅读:
    算法
    jquery-lazyload延迟加载图片
    配置图片服务器
    Flutter开发之dart语言从入门到精通(从入坑到入土)
    阿里淘系技术分享:Flutter 快速上手方法!!!
    如何优雅的处理 Android 重复点击 [建议收藏]
    还谈论Android的前景?根本没什么好问的……
    一个商业级智能家居 Android 开源项目分享
    【前端算法】拼多多技术面试算法题分享
    美团Android岗面试真题:手写红黑树详解
  • 原文地址:https://www.cnblogs.com/nexiyi/p/2806372.html
Copyright © 2020-2023  润新知