zoukankan      html  css  js  c++  java
  • 动态代理的api实现

    Proxy(Java提供的用于生成动态代理对象的类)

    实现步骤:
    a.让被代理对象和代理对象实现相同的接口
    b.在代理对象中保存被代理对象的引用
    c.代理对象重写接口的方法,如果增删改相关方法,直接抛出异常,如果查询方法调用被代理对象的方法操作即可!

    Proxy(Java提供的用于生成动态代理对象的类)
    //动态生成一个类的代理类的对象
    public static Object newProxyInstance(
        ClassLoader loader,
        //参数1,称为类加载,给当前类的类加载器即可,当前类名.class.getClassLoader()
        Class[] classes,
        //参数2,给代理类和被代理类要共同实现的接口的字节码文件, 被代理对象.getClass().getInterfaces()
        InvocationHandler handler
        //参数3.处理实现类对象
    );
    
    接口InvocationHandler的抽象方法:
        //处理方法,拦截方法
        public Object invoke(Object proxy, Method method, Object[] args);
                                代理对象     被懒拦截主方法对象    前面这个方法的参数

    案例

    //1.创建一个集合
    ArrayList<String> arr = new ArrayList<String>();
    //2.保存一些重要信息
    arr.add("jack");
    arr.add("13838385438");
    arr.add("北京市顺义区xx路");
    //拦截方法,当我们调用arrProxy代理对象的任务方法时,都会被拦截住
    List<String> arrProxy = (List<String>) Proxy.newProxyInstance(
                    ProxyTest.class.getClassLoader(), //类加载器
                    arr.getClass().getInterfaces(), //接口的字节码文件数组
                    (proxy, method, args1) -> {
    //                        System.out.println("被拦截的方法:" + method.getName());
    //                        System.out.println("方法参数:" + Arrays.toString(args));
                        //如果和get有关方法,就调用真实对象的方法
                        String name = method.getName();
                        if (name.startsWith("get")) {
                            //如果和get有关方法,就调用真实对象的方法
                            return method.invoke(arr, args1);
                        } else {
                            //如果其他方法,直接抛出异常
                            throw new UnsupportedOperationException("方法" + name + "不支持...");
                        }
                    }
    );
  • 相关阅读:
    关于获取路径
    今天最好的生日礼物就是重新找到目标
    Fedora与Ubuntu安装g++的命令
    CMPXCHG8B 比较并交换 8 字节
    关于 WIN32_LEAN_AND_MEAN
    i386和i686
    Intrinsic function
    VC9: LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
    Linux内核中的Min和Max函数
    linux重定向命令应用及语法
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13262149.html
Copyright © 2011-2022 走看看