zoukankan      html  css  js  c++  java
  • 动态代理

    1.  接口类

    package com.dynamicProxy;
    
    public interface User {
        int add(int i, int j);
        int sub(int i, int j);
        int mul(int i, int j);
        int div(int i, int j);
    }

    2. 实现类

    package com.dynamicProxy;
    
    public class UserImpl implements User {
    
        public int add(int i, int j) {
            return i + j;
        }
    
        public int sub(int i, int j) {
            return i - j;
        }
    
        public int mul(int i, int j) {
            return i*j;
        }
    
        public int div(int i, int j) {
            return i/j;
        }
    
    }

    3. 代理类

    package com.dynamicProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.rmi.server.LoaderHandler;
    import java.util.Arrays;
    
    public class UserImplProxy {
        //1. 指定被代理的对象
        private User u = null;
        
        //2. 传入被代理的对象
        public UserImplProxy(User u) {
            this.u = u;
        }
        
        //3. 定义一个返回 User 对象的方法
        public User getProxyObject() {
            User userProxy = null;
            
            //5. 对象由那个类加载器负责
            ClassLoader loader = u.getClass().getClassLoader();
            
            //6. 代理对象的类型,  即那些方法
            Class[] interfaces = new Class[] {User.class};
            
            //7. 当调用代理对象的方法时   执行其中的方法
            InvocationHandler h = new InvocationHandler() {
                /**
                 * proxy: 正在返回的那个代理对象
                 * method: 代理对象执行的方法
                 * args: 执行参数
                 */
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("The method "+method.getName()+" begin with "+Arrays.asList(args));
                    Object result = method.invoke(u, args);
                    return result;
                }
            };
            
            //4. 通过代理方法来处理 User 对象的方法
            userProxy = (User) Proxy.newProxyInstance(loader, interfaces, h);
            
            return userProxy;
        } 
    }

    4. 测试类

    package com.dynamicProxy;
    
    public class Test {
        public static void main(String[] args) {
            User u = new UserImpl();
            
            User u2 = new UserImplProxy(u).getProxyObject();
            
            int result = u2.add(20,  4);
            System.out.println(result);
            
            result = u2.sub(20,  4);
            System.out.println(result);
        }
    }
  • 相关阅读:
    ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
    ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
    thinkphp第二天
    ThinkPHP第五天(提交类型判定常量IS_POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中.语法配置)
    高阶函数、函数嵌套和闭包
    递 归
    函数式编程
    命名空间
    函数的参数
    循环语句
  • 原文地址:https://www.cnblogs.com/redhat0019/p/8874959.html
Copyright © 2011-2022 走看看